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); } }