使用PDFBox确定PDF中旋转图片定位的问题及优化问询
PDF旋转图片的位置矩形识别问题
背景
我将两张图片逆时针旋转90度后转换为PDF,使用了两种不同工具:
- 文档A:Mac Preview
- 文档B:ImageMagick
在PDF客户端中,两个文档视觉效果完全一致。
问题
我需要获取图片相对于PDF页面的位置信息,代码对其中一个文档的定位识别正确,但对另一个文档错误:
- 文档A:
Rectangle[x=792.0,y=0.0,w=614.4000244140625,h=792.0] - 文档B:
Rectangle[x=0.0,y=0.0,w=792.0,h=614.4000244140625]
可视化矩形信息可见,文档A的矩形(红色)未旋转且x轴偏移过大:
细节
通过PDFBox调试器可见,文档A的图片通过CM操作实现旋转:
q Q q /Perceptual ri q 0 614.4 -792 0 792 0 cm /Im1 Do Q Q
显然我未正确处理旋转操作。
现有代码
Matrix matrix = getGraphicsState().getCurrentTransformationMatrix(); Rectangle2D.Double rectangle = new Rectangle2D.Double( matrix.getTranslateX(), matrix.getTranslateY(), matrix.getScalingFactorX(), matrix.getScalingFactorY() );
尝试的解决方案
我现在可以从矩阵中获取旋转角度:
protected int getRotation() { Matrix matrix = getGraphicsState().getCurrentTransformationMatrix(); double rotationRadians = -Math.atan2(matrix.getShearY(), matrix.getScaleY()); return (int) Math.toDegrees(rotationRadians); }
然后旋转矩形:
public Rectangle2D.Double rotate(Rectangle2D rectangle, int rotationDegrees) { double x = rectangle.getX() + rectangle.getWidth(); double y = rectangle.getY(); AffineTransform rotationTransform = new AffineTransform(); rotationTransform.rotate(Math.toRadians(rotationDegrees), x, y); Shape rotatedRectangle = rotationTransform.createTransformedShape(rectangle); Rectangle2D bounds = rotatedRectangle.getBounds2D(); return (Rectangle2D.Double) bounds; }
现在矩形方向正确(绿色矩形),但仍需调整位置:
我可以通过减去原宽度和旋转后宽度之和来调整新矩形的x位置,但这种方式可能不够健壮,且感觉是在重复造轮子。是否有更优的解决方案?
更新
经进一步测试,该解决方案需针对其他角度调整,我已处理90、180、270度,但担心遇到非标准角度时的适配问题。
内容的提问来源于stack exchange,提问作者Mike Cantrell
相关产品推荐
相关产品推荐

