Author: vfed
Date: Sun Mar 14 20:49:00 2010
New Revision: 922955
URL: http://svn.apache.org/viewvc?rev=922955&view=rev
Log:
PDFBOX-660: applying FontMatrix scale factors to PDFont drawing operations
Modified:
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
Modified: pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=922955&r1=922954&r2=922955&view=diff
==============================================================================
--- pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
(original)
+++ pdfbox/trunk/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java Sun
Mar 14 20:49:00 2010
@@ -33,6 +33,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.common.PDMatrix;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
@@ -176,6 +177,8 @@ public class PageDrawer extends PDFStrea
textPos.setValue(0, 1, (-1)*textPos.getValue(0, 1));
textPos.setValue(1, 0, (-1)*textPos.getValue(1, 0));
AffineTransform at = textPos.createAffineTransform();
+ PDMatrix fontMatrix = font.getFontMatrix();
+ at.scale(fontMatrix.getValue(0, 0) * 1000f, fontMatrix.getValue(1,
0) * 1000f);
graphics.setClip(getGraphicsState().getCurrentClippingPath());
font.drawString( text.getCharacter(), graphics,
text.getFontSize(), at, x, y );
}
Modified:
pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java?rev=922955&r1=922954&r2=922955&view=diff
==============================================================================
--- pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
(original)
+++ pdfbox/trunk/src/main/java/org/apache/pdfbox/pdmodel/font/PDType1CFont.java
Sun Mar 14 20:49:00 2010
@@ -49,16 +49,19 @@ import org.apache.fontbox.cff.encoding.C
import org.apache.fontbox.cff.CFFFont;
import org.apache.fontbox.cff.CFFParser;
import org.apache.fontbox.cff.Type1FontFormatter;
+import org.apache.fontbox.util.BoundingBox;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSNumber;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.encoding.Encoding;
import org.apache.pdfbox.encoding.EncodingManager;
import org.apache.pdfbox.exceptions.WrappedIOException;
+import org.apache.pdfbox.pdmodel.common.PDMatrix;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
/**
@@ -88,6 +91,8 @@ public class PDType1CFont extends PDSimp
private PDRectangle fontBBox = null;
+ private PDMatrix fontMatrix = null;
+
private static final Log log = LogFactory.getLog(PDType1CFont.class);
private static final byte[] SPACE_BYTES = {(byte)32};
@@ -255,7 +260,33 @@ public class PDType1CFont extends PDSimp
/**
* {...@inheritdoc}
*/
- public void drawString( String string, Graphics g, float fontSize,
AffineTransform at, float x, float y )
+ public PDMatrix getFontMatrix()
+ {
+ if( this.fontMatrix == null )
+ {
+ List<Number> numbers =
(List<Number>)this.cffFont.getProperty("FontMatrix");
+ if( numbers != null && numbers.size() == 6 )
+ {
+ COSArray array = new COSArray();
+ for(Number number : numbers)
+ {
+ array.add(new COSFloat(number.floatValue()));
+ }
+ this.fontMatrix = new PDMatrix(array);
+ }
+ else
+ {
+ this.fontMatrix = super.getFontMatrix();
+ }
+ }
+
+ return this.fontMatrix;
+ }
+
+ /**
+ * {...@inheritdoc}
+ */
+ public void drawString( String string, Graphics g, float fontSize,
AffineTransform at, float x, float y )
throws IOException
{
Graphics2D g2d = (Graphics2D)g;
@@ -482,7 +513,19 @@ public class PDType1CFont extends PDSimp
AFMParser afmParser = new AFMParser(is);
afmParser.parse();
- return afmParser.getResult();
+ FontMetric result = afmParser.getResult();
+
+ // Replace default FontBBox value with a newly computed one
+ BoundingBox bounds = result.getFontBBox();
+ List<Integer> numbers = Arrays.asList(
+ Integer.valueOf((int)bounds.getLowerLeftX()),
+ Integer.valueOf((int)bounds.getLowerLeftY()),
+ Integer.valueOf((int)bounds.getUpperRightX()),
+ Integer.valueOf((int)bounds.getUpperRightY())
+ );
+ font.addValueToTopDict("FontBBox", numbers);
+
+ return result;
}
finally
{