You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2016/01/05 16:04:48 UTC

svn commit: r1723090 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/text/PDFTextStreamEngine.java

Author: lehmi
Date: Tue Jan  5 15:04:48 2016
New Revision: 1723090

URL: http://svn.apache.org/viewvc?rev=1723090&view=rev
Log:
PDFBOX-3127: adjust width calculation for vertical fonts

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/text/PDFTextStreamEngine.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/text/PDFTextStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/text/PDFTextStreamEngine.java?rev=1723090&r1=1723089&r2=1723090&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/text/PDFTextStreamEngine.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/text/PDFTextStreamEngine.java Tue Jan  5 15:04:48 2016
@@ -23,12 +23,18 @@ import org.apache.pdfbox.contentstream.P
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.font.PDCIDFont;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
 import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDSimpleFont;
+import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
+import org.apache.pdfbox.pdmodel.font.PDType0Font;
 import org.apache.pdfbox.pdmodel.font.PDType3Font;
 import org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState;
 
 import java.io.IOException;
+
+import org.apache.fontbox.ttf.TrueTypeFont;
 import org.apache.fontbox.util.BoundingBox;
 import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.util.Vector;
@@ -179,10 +185,36 @@ class PDFTextStreamEngine extends PDFStr
             height = glyphHeight / 1000;
         }
 
+        float displacementX = displacement.getX();
+        // the sorting algorithm is based on the width of the character. As the displacement
+        // for vertical characters doesn't provide any suitable value for it, we have to 
+        // calculate our own
+        if (font.isVertical())
+        {
+            displacementX = font.getWidth(code) / 1000;
+            // there may be an additional scaling factor for true type fonts
+            TrueTypeFont ttf = null;
+            if (font instanceof PDTrueTypeFont)
+            {
+                 ttf = ((PDTrueTypeFont)font).getTrueTypeFont();
+            }
+            else if (font instanceof PDType0Font)
+            {
+                PDCIDFont cidFont = ((PDType0Font)font).getDescendantFont();
+                if (cidFont instanceof PDCIDFontType2)
+                {
+                    ttf = ((PDCIDFontType2)cidFont).getTrueTypeFont();
+                }
+            }
+            if (ttf != null && ttf.getUnitsPerEm() != 1000)
+            {
+                displacementX *= 1000f / ttf.getUnitsPerEm();
+            }
+        }
         // (modified) combined displacement, this is calculated *without* taking the character
         // spacing and word spacing into account, due to legacy code in TextStripper
-        float tx = displacement.getX() * fontSize * horizontalScaling;
-        float ty = 0; // todo: support vertical writing mode
+        float tx = displacementX * fontSize * horizontalScaling;
+        float ty = displacement.getY() * fontSize;
 
         // (modified) combined displacement matrix
         Matrix td = Matrix.getTranslateInstance(tx, ty);