]> source.dussan.org Git - poi.git/commitdiff
#62355 - unsplit packages - 2 - modified classes (not only imports)
authorAndreas Beeker <kiwiwings@apache.org>
Sun, 27 May 2018 22:01:33 +0000 (22:01 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sun, 27 May 2018 22:01:33 +0000 (22:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1832359 13f79535-47bb-0310-9956-ffa450edef68

15 files changed:
build.xml
sonar/ooxml/pom.xml
sonar/pom.xml
src/integrationtest/org/apache/poi/stress/SpreadsheetHandler.java
src/java/org/apache/poi/extractor/OLE2ExtractorFactory.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java [new file with mode: 0644]
src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java
src/java/org/apache/poi/ss/usermodel/ObjectData.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideShowFactory.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFObjectData.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java [new file with mode: 0644]
src/ooxml/testcases/org/apache/poi/ss/TestWorkbookFactory.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
src/scratchpad/src/org/apache/poi/hwpf/converter/AbstractWordUtils.java
src/scratchpad/src/org/apache/poi/hwpf/converter/DefaultFontReplacer.java

index db733412e78cccfde1fc3dd49499d9b914c4d112..b52279d1f12e9a8b0dea4dcd44b0b0872941a563 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -869,7 +869,7 @@ under the License.
 
             <replace dir="${xmlbean.sources.dir}" includes="**/*.java" excludes="**/impl/**">
                 <replacetoken>org.apache.xmlbeans.XmlBeans.getContextTypeLoader()</replacetoken>
-                <replacevalue>org.apache.poi.POIXMLTypeLoader</replacevalue>
+                <replacevalue>org.apache.poi.ooxml.POIXMLTypeLoader</replacevalue>
             </replace>
 
             <!-- remove deprecated warnings, as we prefer the array methods - see #56854 -->
@@ -880,9 +880,9 @@ under the License.
 
             <copy todir="${xmlbean.sources.dir}">
                 <fileset dir="${ooxml.src}">
-                    <include name="org/apache/poi/POIXMLTypeLoader.java"/>
-                    <include name="org/apache/poi/util/DocumentHelper.java"/>
-                    <include name="org/apache/poi/util/SAXHelper.java"/>
+                    <include name="org/apache/poi/ooxml/POIXMLTypeLoader.java"/>
+                    <include name="org/apache/poi/ooxml/util/DocumentHelper.java"/>
+                    <include name="org/apache/poi/ooxml/util/SAXHelper.java"/>
                     <include name="org/apache/poi/openxml4j/opc/PackageNamespaces.java"/>
                 </fileset>
                 <fileset dir="${main.src}">
@@ -907,10 +907,6 @@ under the License.
                    includeantruntime="false">
                    <!-- debug="${compile.debug}" -->
                 <classpath refid="ooxml.classpath"/>
-
-                <!-- unfortunately JUnit is required here for OOXMLLite, we should rather move OOXMLLite
-                to test or a separate folder to clean up dependencies -->
-                <classpath location="${main.junit.jar}"/>
             </javac>
 
             <jar basedir="${xmlbean.classes.dir}" destfile="@{classes-jar}" excludes="org/apache/**" level="9" />
@@ -1081,10 +1077,6 @@ under the License.
             <classpath>
                 <path refid="ooxml.classpath"/>
                 <path refid="ooxml.xmlsec.classpath"/>
-
-                <!-- unfortunately JUnit is required here for OOXMLLite, we should rather move OOXMLLite
-                to test or a separate folder to clean up dependencies -->
-                <pathelement location="${main.junit.jar}"/>
             </classpath>
         </javac>
         <!-- compile the tests -->
@@ -1562,7 +1554,7 @@ under the License.
             <zipfileset includes="**/*" src="${ooxml.security.jar}"/>
         </jar>
 
-        <java classname="org.apache.poi.util.OOXMLLite" fork="yes"
+        <java classname="org.apache.poi.ooxml.util.OOXMLLite" fork="yes"
             failonerror="true">
             <classpath>
                 <pathelement path="${ooxml.lite-merged.dir}/ooxml-lite-merged.jar"/>
index 0e0b797848b11b53ddc4eccbf6444de1987a752c..651e546f675a87786f09fe721671faecf4795489 100644 (file)
                        <version>1.05</version>
                </dependency>
   
-               <!-- non-test dependency for OOXMLLite -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>${junit.version}</version>
+                       <scope>test</scope>
         </dependency>
 
         <dependency>
index 50a1b3fb057052b3c25545e0e0002f63e34470cb..d673b570d2e514b9dcdaa915f69beafe2697f666 100644 (file)
                   <target>
                     <replace dir="${basedir}/target/generated-sources/xmlbeans" includes="**/*.java" excludes="**/impl/**">
                         <replacetoken>org.apache.xmlbeans.XmlBeans.getContextTypeLoader()</replacetoken>
-                        <replacevalue>org.apache.poi.POIXMLTypeLoader</replacevalue>
+                        <replacevalue>org.apache.poi.ooxml.POIXMLTypeLoader</replacevalue>
                     </replace>                    
                   </target>
                 </configuration>
index 2b5c6295fdbbccc3b556d857131009bbdaff5b67..05147ff6d0566a8db5d4ac1ec543530c9a026e92 100644 (file)
@@ -48,12 +48,8 @@ public abstract class SpreadsheetHandler extends AbstractFileHandler {
                ByteArrayOutputStream out = writeToArray(wb);
 
                // read in the written file
-               Workbook read;
-               try {
-                       read = WorkbookFactory.create(new ByteArrayInputStream(out.toByteArray()));
-               } catch (InvalidFormatException e) {
-                       throw new IllegalStateException(e);
-               }
+               Workbook read = WorkbookFactory.create(new ByteArrayInputStream(out.toByteArray()));
+
                assertNotNull(read);
                
                readContent(read);
index 5e52f9d6c2ab07b252f36c27ce93f53266d14246..fda090729e09a4b88141622d6218b345c73b2f4b 100644 (file)
@@ -27,8 +27,6 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.poi.EncryptedDocumentException;
-import org.apache.poi.POIOLE2TextExtractor;
-import org.apache.poi.POITextExtractor;
 import org.apache.poi.hssf.OldExcelFormatException;
 import org.apache.poi.hssf.extractor.EventBasedExcelExtractor;
 import org.apache.poi.hssf.extractor.ExcelExtractor;
@@ -108,7 +106,7 @@ public class OLE2ExtractorFactory {
      * Should this thread use event based extractors is available?
      * Checks the all-threads one first, then thread specific.
      */
-    protected static boolean getPreferEventExtractor() {
+    public static boolean getPreferEventExtractor() {
         if(allPreferEventExtractors != null) {
             return allPreferEventExtractors;
         }
@@ -156,7 +154,7 @@ public class OLE2ExtractorFactory {
     private static Class<?> getScratchpadClass() {
         try {
             return OLE2ExtractorFactory.class.getClassLoader().loadClass(
-                    "org.apache.poi.extractor.OLE2ScratchpadExtractorFactory"
+                    "org.apache.poi.extractor.ole2.OLE2ScratchpadExtractorFactory"
             );
         } catch (ClassNotFoundException e) {
             LOGGER.log(POILogger.ERROR, "POI Scratchpad jar missing");
diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbookFactory.java
new file mode 100644 (file)
index 0000000..f0eefd5
--- /dev/null
@@ -0,0 +1,50 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.usermodel;
+
+import java.io.IOException;
+
+import org.apache.poi.poifs.filesystem.DirectoryNode;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.apache.poi.util.Internal;
+
+/**
+ * Helper class which is instantiated by reflection from
+ * {@link WorkbookFactory#create(java.io.File)} and similar
+ */
+@Internal
+public class HSSFWorkbookFactory extends WorkbookFactory {
+    /**
+     * Creates a HSSFWorkbook from the given NPOIFSFileSystem<p>
+     * Note that in order to properly release resources the
+     * Workbook should be closed after use.
+     */
+    public static HSSFWorkbook createWorkbook(final NPOIFSFileSystem fs) throws IOException {
+        return new HSSFWorkbook(fs);
+    }
+
+    /**
+     * Creates a HSSFWorkbook from the given DirectoryNode<p>
+     * Note that in order to properly release resources the
+     * Workbook should be closed after use.
+     */
+    public static HSSFWorkbook createWorkbook(final DirectoryNode root) throws IOException {
+        return new HSSFWorkbook(root, true);
+    }
+}
index 5f75258b9adfd363789b14c7839245e6224a2794..31c669cf03dcbd300daa4eef8530efec48cf144b 100644 (file)
@@ -189,7 +189,7 @@ public class SlideShowFactory {
         case OOXML:
             return createXSLFSlideShow(is);
         default:
-            throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
+            throw new IOException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
         }
     }
 
@@ -314,6 +314,8 @@ public class SlideShowFactory {
                 throw (EncryptedDocumentException)t;
             } else if (t instanceof OldFileFormatException) {
                 throw (OldFileFormatException)t;
+            } else if (t instanceof RuntimeException) {
+                throw (RuntimeException)t;
             } else {
                 throw new IOException(t);
             }
index d157dba53d900c2f23ae10ac09e07f4bb91a9bb2..3d21b1a8d26697983cbfc694b63daf1cf5d457dd 100644 (file)
@@ -62,4 +62,8 @@ public interface ObjectData extends SimpleShape {
      * @return the preview picture
      */
     PictureData getPictureData();
+
+    default String getContentType() {
+        return "binary/octet-stream";
+    }
 }
index 501132c00c5ac96ea3904b4596565bd98f8691ea..c62e24134d8341c489b49d8a3f5d756fafcc963a 100644 (file)
@@ -31,6 +31,33 @@ import org.apache.poi.util.Internal;
 @Internal
 public class XSLFSlideShowFactory extends SlideShowFactory {
 
+    /**
+     * Creates a XMLSlideShow from the given OOXML Package.
+     * This is a convenience method to go along the create-methods of the super class.
+     *
+     * <p>Note that in order to properly release resources the
+     *  SlideShow should be closed after use.</p>
+     *
+     *  @param pkg The {@link OPCPackage} opened for reading data.
+     *
+     *  @return The created SlideShow
+     *
+     *  @throws IOException if an error occurs while reading the data
+     * @throws InvalidFormatException
+     */
+    public static XMLSlideShow create(OPCPackage pkg) throws IOException {
+        try {
+            return new XMLSlideShow(pkg);
+        } catch (IllegalArgumentException ioe) {
+            // ensure that file handles are closed (use revert() to not re-write the file)
+            pkg.revert();
+            //pkg.close();
+
+            // rethrow exception
+            throw ioe;
+        }
+    }
+
     /**
      * Creates a XMLSlideShow from the given OOXML Package
      *
index c20d8d44cce2762fb9e53de5e13a876b3230a210..0544800e678aca934097db5514b03ec24700d63f 100644 (file)
@@ -23,8 +23,8 @@ import java.io.InputStream;
 
 import javax.xml.namespace.QName;
 
-import org.apache.poi.POIXMLDocumentPart;
-import org.apache.poi.POIXMLException;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.ooxml.POIXMLException;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
 import org.apache.poi.poifs.filesystem.DirectoryEntry;
@@ -202,4 +202,9 @@ public class XSSFObjectData extends XSSFSimpleShape implements ObjectData {
             cur.dispose();
         }
     }
+
+    @Override
+    public String getContentType() {
+        return getObjectPart().getContentType();
+    }
 }
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbookFactory.java
new file mode 100644 (file)
index 0000000..4bb6acc
--- /dev/null
@@ -0,0 +1,134 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.xssf.usermodel;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackageAccess;
+import org.apache.poi.openxml4j.opc.ZipPackage;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+
+public class XSSFWorkbookFactory extends WorkbookFactory {
+
+    /**
+     * Creates a XSSFWorkbook from the given OOXML Package.
+     * This is a convenience method to go along the create-methods of the super class.
+     *
+     * <p>Note that in order to properly release resources the
+     *  Workbook should be closed after use.</p>
+     *
+     *  @param pkg The {@link OPCPackage} opened for reading data.
+     *
+     *  @return The created Workbook
+     *
+     *  @throws IOException if an error occurs while reading the data
+     * @throws InvalidFormatException
+     */
+    public static XSSFWorkbook create(OPCPackage pkg) throws IOException {
+        return createWorkbook(pkg);
+    }
+
+    /**
+     * Creates a XSSFWorkbook from the given OOXML Package
+     *
+     * <p>Note that in order to properly release resources the
+     *  Workbook should be closed after use.</p>
+     *
+     *  @param pkg The {@link ZipPackage} opened for reading data.
+     *
+     *  @return The created Workbook
+     *
+     *  @throws IOException if an error occurs while reading the data
+     * @throws InvalidFormatException
+     */
+    public static XSSFWorkbook createWorkbook(ZipPackage pkg) throws IOException {
+        return createWorkbook((OPCPackage)pkg);
+    }
+
+    /**
+     * Creates a XSSFWorkbook from the given OOXML Package
+     *
+     * <p>Note that in order to properly release resources the
+     *  Workbook should be closed after use.</p>
+     *
+     *  @param pkg The {@link OPCPackage} opened for reading data.
+     *
+     *  @return The created Workbook
+     *
+     *  @throws IOException if an error occurs while reading the data
+     * @throws InvalidFormatException
+     */
+    public static XSSFWorkbook createWorkbook(OPCPackage pkg) throws IOException {
+        try {
+            return new XSSFWorkbook(pkg);
+        } catch (IllegalArgumentException ioe) {
+            // ensure that file handles are closed (use revert() to not re-write the file)
+            pkg.revert();
+            //pkg.close();
+
+            // rethrow exception
+            throw ioe;
+        }
+    }
+
+    /**
+     * Creates the XSSFWorkbook from the given File, which must exist and be readable.
+     * <p>Note that in order to properly release resources the Workbook should be closed after use.
+     *
+     *  @param file The file to read data from.
+     *  @param readOnly If the Workbook should be opened in read-only mode to avoid writing back
+     *      changes when the document is closed.
+     *
+     *  @return The created Workbook
+     *
+     *  @throws IOException if an error occurs while reading the data
+     *  @throws EncryptedDocumentException If the wrong password is given for a protected file
+     */
+    @SuppressWarnings("resource")
+    public static XSSFWorkbook createWorkbook(File file, boolean readOnly)
+            throws IOException, InvalidFormatException {
+        OPCPackage pkg = OPCPackage.open(file, readOnly ? PackageAccess.READ : PackageAccess.READ_WRITE);
+        return createWorkbook(pkg);
+    }
+
+    /**
+     * Creates a XSSFWorkbook from the given InputStream
+     *
+     * <p>Note that in order to properly release resources the
+     * Workbook should be closed after use.</p>
+     *
+     * @param stream The {@link InputStream} to read data from.
+     *
+     * @return The created Workbook
+     *
+     * @throws IOException if an error occurs while reading the data
+     * @throws InvalidFormatException
+     */
+    @SuppressWarnings("resource")
+    public static XSSFWorkbook createWorkbook(InputStream stream) throws IOException, InvalidFormatException {
+        OPCPackage pkg = OPCPackage.open(stream);
+        return createWorkbook(pkg);
+    }
+
+
+}
index 4b77e96bef24745a5e420d0f82d3edd4fabe0f79..645a28bf351e3e960a770183c4f3fb77d4e55135 100644 (file)
@@ -39,6 +39,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackageAccess;
+import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
 import org.junit.Test;
 
 public final class TestWorkbookFactory {
@@ -107,7 +108,7 @@ public final class TestWorkbookFactory {
         assertCloseDoesNotModifyFile(xls, wb);
 
         // Package -> xssf
-        wb = WorkbookFactory.create(
+        wb = XSSFWorkbookFactory.create(
                 OPCPackage.open(
                         HSSFTestDataSamples.openSampleFileStream(xlsx))
         );
@@ -182,7 +183,7 @@ public final class TestWorkbookFactory {
                 stream.close();
             }
             fail();
-        } catch(InvalidFormatException e) {
+        } catch(IOException e) {
             // Good
         }
         final byte[] after = HSSFTestDataSamples.getTestDataFileContent(txt);
index c6c25f3f62e5ea1c2d4de96483fcab7148f6eeaa..8d73577838693bb471d634fa746c8a3ca93f03d5 100644 (file)
@@ -46,10 +46,10 @@ import java.util.TreeMap;
 
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.POIXMLDocumentPart;
-import org.apache.poi.POIXMLDocumentPart.RelationPart;
-import org.apache.poi.POIXMLException;
-import org.apache.poi.POIXMLProperties;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
+import org.apache.poi.ooxml.POIXMLException;
+import org.apache.poi.ooxml.POIXMLProperties;
 import org.apache.poi.common.usermodel.HyperlinkType;
 import org.apache.poi.hssf.HSSFITestDataProvider;
 import org.apache.poi.hssf.HSSFTestDataSamples;
@@ -1459,10 +1459,10 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
     }
 
     /**
-     * Password Protected .xlsx files should give a helpful
-     * error message when called via WorkbookFactory with no password
+     * Password Protected .xlsx files are now (as of 4.0.0) tested for the default password
+     * when opened via WorkbookFactory, so there's no EncryptedDocumentException thrown anymore
      */
-    @Test(expected = EncryptedDocumentException.class)
+    @Test
     public void bug55692_poifs() throws IOException {
         // Via a POIFSFileSystem
         try (POIFSFileSystem fsP = new POIFSFileSystem(
@@ -1951,7 +1951,7 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
 
         // Workbook Factory gives helpful error on package
         try {
-            WorkbookFactory.create(pkg).close();
+            XSSFWorkbookFactory.create(pkg).close();
             fail(".xlsb files not supported");
         } catch (XLSBUnsupportedException e) {
             // Good, detected and warned
index e5b0fac89f0c826635204c8ceb6c576646f447d3..a29bd305a08f4f7ba91fdca59d31927e85081367 100644 (file)
@@ -502,18 +502,4 @@ public class AbstractWordUtils
         return loadDoc( poifsFileSystem.getRoot() );
     }
 
-    static String substringBeforeLast( String str, String separator )
-    {
-        if ( isEmpty( str ) || isEmpty( separator ) )
-        {
-            return str;
-        }
-        int pos = str.lastIndexOf( separator );
-        if ( pos == -1 )
-        {
-            return str;
-        }
-        return str.substring( 0, pos );
-    }
-
 }
index c7392c4e3785d708ec88a079681fded5bc11d4a2..b9845fd3489f1d7c49a9d389747e7daaf99ecaea 100644 (file)
@@ -23,37 +23,33 @@ public class DefaultFontReplacer implements FontReplacer
 {
     public Triplet update( Triplet original )
     {
-        if ( AbstractWordUtils.isNotEmpty( original.fontName ) )
+        if ( isNotEmpty( original.fontName ) )
         {
             String fontName = original.fontName;
 
             if ( fontName.endsWith( " Regular" ) )
-                fontName = AbstractWordUtils.substringBeforeLast( fontName,
-                        " Regular" );
+                fontName = substringBeforeLast( fontName, " Regular" );
 
             if ( fontName
                     .endsWith( " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439" ) )
-                fontName = AbstractWordUtils
-                        .substringBeforeLast( fontName,
-                                " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439" )
+                fontName = substringBeforeLast( fontName,
+                        " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439" )
                         + " Bold";
 
             if ( fontName
                     .endsWith( " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439 \u041A\u0443\u0440\u0441\u0438\u0432" ) )
-                fontName = AbstractWordUtils
-                        .substringBeforeLast(
-                                fontName,
-                                " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439 \u041A\u0443\u0440\u0441\u0438\u0432" )
+                fontName = substringBeforeLast(
+                        fontName,
+                        " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439 \u041A\u0443\u0440\u0441\u0438\u0432" )
                         + " Bold Italic";
 
             if ( fontName.endsWith( " \u041A\u0443\u0440\u0441\u0438\u0432" ) )
-                fontName = AbstractWordUtils.substringBeforeLast( fontName,
-                        " \u041A\u0443\u0440\u0441\u0438\u0432" ) + " Italic";
+                fontName = substringBeforeLast( fontName, " \u041A\u0443\u0440\u0441\u0438\u0432" ) + " Italic";
 
             original.fontName = fontName;
         }
 
-        if ( AbstractWordUtils.isNotEmpty( original.fontName ) )
+        if ( isNotEmpty( original.fontName ) )
         {
             if ( "Times Regular".equals( original.fontName )
                     || "Times-Regular".equals( original.fontName )
@@ -88,4 +84,30 @@ public class DefaultFontReplacer implements FontReplacer
 
         return original;
     }
+
+    private static boolean isEmpty( String str )
+    {
+        return str == null || str.length() == 0;
+    }
+
+    private static boolean isNotEmpty( String str )
+    {
+        return !isEmpty( str );
+    }
+
+
+    private static String substringBeforeLast( String str, String separator )
+    {
+        if ( isEmpty( str ) || isEmpty( separator ) )
+        {
+            return str;
+        }
+        int pos = str.lastIndexOf( separator );
+        if ( pos == -1 )
+        {
+            return str;
+        }
+        return str.substring( 0, pos );
+    }
+
 }