You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:55:30