Author: jahewson
Date: Mon Nov 2 20:02:59 2015
New Revision: 1712132
URL: http://svn.apache.org/viewvc?rev=1712132&view=rev
Log:
PDFBOX-3081: corrections to bbox bounds
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/DrawPrintTextLocations.java
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/DrawPrintTextLocations.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/DrawPrintTextLocations.java?rev=1712132&r1=1712131&r2=1712132&view=diff
==============================================================================
---
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/DrawPrintTextLocations.java
(original)
+++
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/DrawPrintTextLocations.java
Mon Nov 2 20:02:59 2015
@@ -19,7 +19,8 @@ package org.apache.pdfbox.examples.util;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
-import java.awt.geom.Point2D;
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
@@ -32,6 +33,7 @@ import javax.imageio.ImageIO;
import org.apache.fontbox.util.BoundingBox;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.pdfbox.pdmodel.font.PDType3Font;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
@@ -155,17 +157,35 @@ public class DrawPrintTextLocations exte
// usually, the height is identical to what you see when marking
text in Adobe Reader
PDFont font = text.getFont();
BoundingBox bbox = font.getBoundingBox();
- Point2D.Float p1 =
font.getFontMatrix().transformPoint(bbox.getLowerLeftX(), bbox.getLowerLeftY());
- Point2D.Float p2 =
font.getFontMatrix().transformPoint(bbox.getUpperRightX(),
bbox.getUpperRightY());
- rect = new Rectangle2D.Float(
- text.getXDirAdj(),
- (text.getYDirAdj() - p2.y * text.getYScale()),
- text.getWidthDirAdj(),
- (p2.y - p1.y) * text.getYScale());
- g2d.setColor(Color.blue);
- g2d.draw(rect);
+ // advance width, bbox height (glyph space)
+ float xadvance = font.getWidth(text.getCharacterCodes()[0]); //
todo: should iterate all chars
+ rect = new Rectangle2D.Float(0, bbox.getLowerLeftY(), xadvance,
+ bbox.getUpperRightY() -
bbox.getLowerLeftY());
+
+ // glyph space -> user space
+ // note: text.getTextMatrix() is *not* the Text Matrix, it's the
Text Rendering Matrix
+ AffineTransform at = text.getTextMatrix().createAffineTransform();
+ if (font instanceof PDType3Font)
+ {
+ // bbox and font matrix are unscaled
+ at.concatenate(font.getFontMatrix().createAffineTransform());
+ }
+ else
+ {
+ // bbox and font matrix are already scaled to 1000
+ at.scale(1/1000f, 1/1000f);
+ }
+ Shape s = at.createTransformedShape(rect);
+ // flip y-axis
+ AffineTransform flip = new AffineTransform();
+ flip.translate(0, getCurrentPage().getBBox().getHeight());
+ flip.scale(1, -1);
+ s = flip.createTransformedShape(s);
+
+ g2d.setColor(Color.blue);
+ g2d.draw(s);
}
}