]> source.dussan.org Git - poi.git/commitdiff
add page breaks support; fix paragraphs-in-bookmarks handling
authorSergey Vladimirov <sergey@apache.org>
Mon, 22 Aug 2011 15:01:49 +0000 (15:01 +0000)
committerSergey Vladimirov <sergey@apache.org>
Mon, 22 Aug 2011 15:01:49 +0000 (15:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1160288 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/converter/AbstractWordConverter.java
src/scratchpad/src/org/apache/poi/hwpf/converter/AbstractWordUtils.java
src/scratchpad/src/org/apache/poi/hwpf/converter/WordToFoConverter.java
src/scratchpad/src/org/apache/poi/hwpf/converter/WordToFoUtils.java
src/scratchpad/src/org/apache/poi/hwpf/converter/WordToHtmlConverter.java
src/scratchpad/src/org/apache/poi/hwpf/converter/WordToHtmlUtils.java
src/scratchpad/src/org/apache/poi/hwpf/converter/WordToTextConverter.java

index 11f13b34fb79c27d5fdcf753c65cbeff59d65ec0..3a0c978ba30927034b83eb8a6cb4b1b3d30b18dd 100644 (file)
@@ -342,8 +342,8 @@ public abstract class AbstractWordConverter
                 bookmarkStack.addAll( bookmarks );
                 try
                 {
-                    Range subrange = new Range( structure.start, structure.end,
-                            range )
+                    int end = Math.min( range.getEndOffset(), structure.end );
+                    Range subrange = new Range( structure.start, end, range )
                     {
                         @Override
                         public String toString()
@@ -372,7 +372,7 @@ public abstract class AbstractWordConverter
                         + structure.structure.getClass() );
             }
 
-            previous = structure.end;
+            previous = Math.min( range.getEndOffset(), structure.end );
         }
 
         if ( previous != range.getStartOffset() )
@@ -865,6 +865,9 @@ public abstract class AbstractWordConverter
         return false;
     }
 
+    protected abstract void processPageBreak( HWPFDocumentCore wordDocument,
+            Element flow );
+
     protected abstract void processPageref( HWPFDocumentCore wordDocument,
             Element currentBlock, Range textRange, int currentTableLevel,
             String pageref );
@@ -903,6 +906,11 @@ public abstract class AbstractWordConverter
                 continue;
             }
 
+            if ( paragraph.text().equals( "\u000c" ) )
+            {
+                processPageBreak( wordDocument, flow );
+            }
+
             if ( paragraph.getIlfo() != currentListInfo )
             {
                 currentListInfo = paragraph.getIlfo();
index 455eb21b0540568e39de167840f5a2fbec05d8d9..02c79665fe04604d5a30944d74eb7d8509f3626c 100644 (file)
@@ -130,7 +130,7 @@ public class AbstractWordUtils
         return true;
     }
 
-    static void compactChildNodes( Element parentElement, String childTagName )
+    static void compactChildNodesR( Element parentElement, String childTagName )
     {
         NodeList childNodes = parentElement.getChildNodes();
         for ( int i = 0; i < childNodes.getLength() - 1; i++ )
@@ -146,6 +146,16 @@ public class AbstractWordUtils
             child2.getParentNode().removeChild( child2 );
             i--;
         }
+
+        childNodes = parentElement.getChildNodes();
+        for ( int i = 0; i < childNodes.getLength() - 1; i++ )
+        {
+            Node child = childNodes.item( i );
+            if ( child instanceof Element )
+            {
+                compactChildNodesR( (Element) child, childTagName );
+            }
+        }
     }
 
     static boolean equals( String str1, String str2 )
@@ -320,10 +330,12 @@ public class AbstractWordUtils
         if ( argbValue == -1 )
             throw new IllegalArgumentException( "This colorref is empty" );
 
-        int value = argbValue & 0x00FFFFFF;
+        int bgrValue = argbValue & 0x00FFFFFF;
+        int rgbValue = ( bgrValue & 0x0000FF ) << 16 | ( bgrValue & 0x00FF00 )
+                | ( bgrValue & 0xFF0000 ) >> 16;
 
         // http://www.w3.org/TR/REC-html40/types.html#h-6.5
-        switch ( value )
+        switch ( rgbValue )
         {
         case 0xFFFFFF:
             return "white";
@@ -360,7 +372,7 @@ public class AbstractWordUtils
         }
 
         StringBuilder result = new StringBuilder( "#" );
-        String hex = Integer.toHexString( value );
+        String hex = Integer.toHexString( rgbValue );
         for ( int i = hex.length(); i < 6; i++ )
         {
             result.append( '0' );
index 7e3e4dfe7df3debb4e300320fc6d8368edfb7f0c..90cf8aff2e8de1c85781193220ad2f0e2e89c090 100644 (file)
@@ -50,6 +50,8 @@ import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 import org.w3c.dom.Text;
 
 /**
@@ -119,6 +121,8 @@ public class WordToFoConverter extends AbstractWordConverter
 
     private AtomicInteger internalLinkCounter = new AtomicInteger( 0 );
 
+    private boolean outputCharactersLanguage = false;
+
     private Set<String> usedIds = new LinkedHashSet<String>();
 
     /**
@@ -202,6 +206,11 @@ public class WordToFoConverter extends AbstractWordConverter
         return foDocumentFacade.getDocument();
     }
 
+    public boolean isOutputCharactersLanguage()
+    {
+        return outputCharactersLanguage;
+    }
+
     @Override
     protected void outputCharacters( Element block, CharacterRun characterRun,
             String text )
@@ -211,11 +220,15 @@ public class WordToFoConverter extends AbstractWordConverter
         Triplet triplet = getCharacterRunTriplet( characterRun );
 
         if ( WordToFoUtils.isNotEmpty( triplet.fontName ) )
-            WordToFoUtils.setFontFamily( inline, characterRun.getFontName() );
+            WordToFoUtils.setFontFamily( inline, triplet.fontName );
         WordToFoUtils.setBold( inline, triplet.bold );
         WordToFoUtils.setItalic( inline, triplet.italic );
         WordToFoUtils.setFontSize( inline, characterRun.getFontSize() / 2 );
         WordToFoUtils.setCharactersProperties( characterRun, inline );
+
+        if ( isOutputCharactersLanguage() )
+            WordToFoUtils.setLanguage( characterRun, inline );
+
         block.appendChild( inline );
 
         Text textNode = foDocumentFacade.createText( text );
@@ -411,6 +424,32 @@ public class WordToFoConverter extends AbstractWordConverter
         block.appendChild( foDocumentFacade.createBlock() );
     }
 
+    @Override
+    protected void processPageBreak( HWPFDocumentCore wordDocument, Element flow )
+    {
+        Element block = null;
+        NodeList childNodes = flow.getChildNodes();
+        if ( childNodes.getLength() > 0 )
+        {
+            Node lastChild = childNodes.item( childNodes.getLength() - 1 );
+            if ( lastChild instanceof Element )
+            {
+                Element lastElement = (Element) lastChild;
+                if ( !lastElement.hasAttribute( "break-after" ) )
+                {
+                    block = lastElement;
+                }
+            }
+        }
+
+        if ( block == null )
+        {
+            block = foDocumentFacade.createBlock();
+            flow.appendChild( block );
+        }
+        block.setAttribute( "break-after", "page" );
+    }
+
     protected void processPageref( HWPFDocumentCore hwpfDocument,
             Element currentBlock, Range textRange, int currentTableLevel,
             String pageref )
@@ -606,4 +645,9 @@ public class WordToFoConverter extends AbstractWordConverter
         return true;
     }
 
+    public void setOutputCharactersLanguage( boolean outputCharactersLanguage )
+    {
+        this.outputCharactersLanguage = outputCharactersLanguage;
+    }
+
 }
index f80f59c68b71bcc344f072ee4b1d79b2b6d29cb5..c79a3d611dab564ef0b6ff6625e33fc418062efd 100644 (file)
@@ -30,7 +30,7 @@ public class WordToFoUtils extends AbstractWordUtils
 {
     static void compactInlines( Element blockElement )
     {
-        compactChildNodes( blockElement, "fo:inline" );
+        compactChildNodesR( blockElement, "fo:inline" );
     }
 
     public static void setBold( final Element element, final boolean bold )
@@ -82,12 +82,6 @@ public class WordToFoUtils extends AbstractWordUtils
             inline.setAttribute( "opacity",
                     getOpacity( characterRun.getIco24() ) );
         }
-        if ( characterRun.getLanguageCode() != 0 )
-        {
-            final String language = getLanguage( characterRun.getLanguageCode() );
-            if ( isNotEmpty( language ) )
-                inline.setAttribute( "language", language );
-        }
         if ( characterRun.isCapitalized() )
         {
             inline.setAttribute( "text-transform", "uppercase" );
@@ -206,6 +200,17 @@ public class WordToFoUtils extends AbstractWordUtils
             element.setAttribute( "text-align", justification );
     }
 
+    public static void setLanguage( final CharacterRun characterRun,
+            final Element inline )
+    {
+        if ( characterRun.getLanguageCode() != 0 )
+        {
+            final String language = getLanguage( characterRun.getLanguageCode() );
+            if ( isNotEmpty( language ) )
+                inline.setAttribute( "language", language );
+        }
+    }
+
     public static void setParagraphProperties( Paragraph paragraph,
             Element block )
     {
index 59e20e1a07859613f155e4212692d834924e56b8..c33776495f4301e63cd0b091c556b4e6b4f30a76 100644 (file)
@@ -495,6 +495,12 @@ public class WordToHtmlConverter extends AbstractWordConverter
         }
     }
 
+    @Override
+    protected void processPageBreak( HWPFDocumentCore wordDocument, Element flow )
+    {
+        flow.appendChild( htmlDocumentFacade.createLineBreak() );
+    }
+
     protected void processPageref( HWPFDocumentCore hwpfDocument,
             Element currentBlock, Range textRange, int currentTableLevel,
             String pageref )
index b36e1db834bb7aaf39a175ebd0f3561415315ba8..02f85ffbd756f764802f0a80640da94d23a26de7 100644 (file)
@@ -233,7 +233,7 @@ public class WordToHtmlUtils extends AbstractWordUtils
 
     static void compactSpans( Element pElement )
     {
-        compactChildNodes( pElement, "span" );
+        compactChildNodesR( pElement, "span" );
     }
 
 }
index 5998a2b90d2b56e3440e8e25916406ed9664c68c..57ec92f8eebe676027ac5870a686381bfe83cabd 100644 (file)
@@ -380,6 +380,14 @@ public class WordToTextConverter extends AbstractWordConverter
         }
     }
 
+    @Override
+    protected void processPageBreak( HWPFDocumentCore wordDocument, Element flow )
+    {
+        Element block = textDocumentFacade.createBlock();
+        block.appendChild( textDocumentFacade.createText( "\n" ) );
+        flow.appendChild( block );
+    }
+
     @Override
     protected void processPageref( HWPFDocumentCore wordDocument,
             Element currentBlock, Range textRange, int currentTableLevel,