You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/09/02 01:48:16 UTC
svn commit: r1621900 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: pdmodel/font/
rendering/
Author: jahewson
Date: Mon Sep 1 23:48:16 2014
New Revision: 1621900
URL: http://svn.apache.org/r1621900
Log:
PDFBOX-870: Stretch external glyphs to match embedded widths
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDFont.java Mon Sep 1 23:48:16 2014
@@ -225,7 +225,7 @@ public abstract class PDFont implements
* @return width in glyph space
* @throws IOException if the font could not be read
*/
- protected abstract float getWidthFromFont(int code) throws IOException;
+ public abstract float getWidthFromFont(int code) throws IOException;
/**
* Returns true if the font file is embedded in the PDF.
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDTrueTypeFont.java Mon Sep 1 23:48:16 2014
@@ -174,7 +174,7 @@ public class PDTrueTypeFont extends PDSi
}
@Override
- protected float getWidthFromFont(int code) throws IOException
+ public float getWidthFromFont(int code) throws IOException
{
int gid = codeToGID(code);
float width = ttf.getAdvanceWidth(gid);
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType0Font.java Mon Sep 1 23:48:16 2014
@@ -226,7 +226,7 @@ public class PDType0Font extends PDFont
}
@Override
- protected float getWidthFromFont(int code) throws IOException
+ public float getWidthFromFont(int code) throws IOException
{
return descendantFont.getWidthFromFont(code);
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java Mon Sep 1 23:48:16 2014
@@ -182,10 +182,10 @@ public class PDType1CFont extends PDSimp
}
@Override
- protected float getWidthFromFont(int code) throws IOException
+ public float getWidthFromFont(int code) throws IOException
{
String name = codeToName(code);
- int width = cffFont.getType1CharString(name).getWidth();
+ float width = type1Equivalent.getWidth(name);
Point2D p = new Point2D.Float(width, 0);
fontMatrixTransform.transform(p, p);
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1Font.java Mon Sep 1 23:48:16 2014
@@ -285,7 +285,7 @@ public class PDType1Font extends PDSimpl
}
@Override
- protected float getWidthFromFont(int code) throws IOException
+ public float getWidthFromFont(int code) throws IOException
{
String name = codeToName(code);
if (afm != null)
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDType3Font.java Mon Sep 1 23:48:16 2014
@@ -106,7 +106,7 @@ public class PDType3Font extends PDSimpl
}
@Override
- protected float getWidthFromFont(int code)
+ public float getWidthFromFont(int code)
{
// todo: could these be extracted from the font's stream?
throw new UnsupportedOperationException("not suppported");
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1621900&r1=1621899&r2=1621900&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Mon Sep 1 23:48:16 2014
@@ -365,7 +365,7 @@ public class PageDrawer extends PDFGraph
{
// all other fonts use vectors
Glyph2D glyph2D = createGlyph2D(font);
- drawGlyph2D(glyph2D, code, at);
+ drawGlyph2D(glyph2D, font, code, displacement, at);
}
}
@@ -373,11 +373,14 @@ public class PageDrawer extends PDFGraph
* Render the font using the Glyph2D interface.
*
* @param glyph2D the Glyph2D implementation provided a GeneralPath for each glyph
+ * @param font the font
* @param code character code
+ * @param displacement the glyph's displacement (advance)
* @param at the transformation
* @throws IOException if something went wrong
*/
- private void drawGlyph2D(Glyph2D glyph2D, int code, AffineTransform at) throws IOException
+ private void drawGlyph2D(Glyph2D glyph2D, PDFont font, int code, Vector displacement,
+ AffineTransform at) throws IOException
{
PDGraphicsState state = getGraphicsState();
RenderingMode renderingMode = state.getTextState().getRenderingMode();
@@ -385,6 +388,19 @@ public class PageDrawer extends PDFGraph
GeneralPath path = glyph2D.getPathForCharacterCode(code);
if (path != null)
{
+ // stretch non-embedded glyph if it does not match the width contained in the PDF
+ if (!font.isEmbedded())
+ {
+ float fontWidth = font.getWidthFromFont(code);
+ if (fontWidth > 0 && // ignore spaces
+ Math.abs(fontWidth - displacement.getX() * 1000) > 0.0001)
+ {
+ float pdfWidth = displacement.getX() * 1000;
+ at.scale(pdfWidth / fontWidth, 1);
+ }
+ }
+
+ // render glyph
Shape glyph = at.createTransformedShape(path);
if (renderingMode.isFill())