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

横向PDF页面Matrix变换后BoundingBox定位偏差求助

问题分析与解决

你的核心问题是矩阵变换顺序错误,PDF的坐标变换遵循右乘规则,变换执行顺序和代码编写顺序相反,导致旋转后的边框位置偏移。

错误原因

横向PDF页面一般通过设置Page.Rotate=90实现,此时页面的CropBox仍保留纵向尺寸(比如A4的595x842),但显示时会整体旋转90度。你当前先执行旋转再平移,旋转后的坐标系已经改变,后续平移操作是基于旋转后的坐标系计算的,自然和预期的原始文本框位置不匹配。

修正方案

调整变换顺序:先将原点平移到页面右下角,再执行90度旋转,这样变换后的坐标系才能和横向页面的显示坐标对齐。修正后的代码如下:

float pageWidth = lastPage.getCropBox().getWidth();
float pageHeight = lastPage.getCropBox().getHeight();

// 正确的变换矩阵:先平移到页面右下角,再旋转90度
Matrix matrix = Matrix.getTranslateInstance(pageWidth, 0);
matrix.concatenate(Matrix.getRotateInstance(Math.toRadians(90), 0, 0));
canvas.transform(matrix);

// 此时再绘制红色边框,就能和绿色边框重合
canvas.setStrokingColor(Color.RED);
canvas.addRect((float) box.getMinX(), (float) box.getMinY(), (float) box.getWidth(), (float) box.getHeight());
canvas.stroke();

额外建议

如果需要兼容不同旋转角度的页面,可以先获取页面的旋转属性,再动态调整变换逻辑:

int pageRotate = lastPage.getRotation();
float pageWidth = lastPage.getCropBox().getWidth();
float pageHeight = lastPage.getCropBox().getHeight();

Matrix matrix = new Matrix();
switch (pageRotate) {
    case 90:
        matrix.translate(pageWidth, 0);
        matrix.rotate(Math.toRadians(90));
        break;
    case 180:
        matrix.translate(pageWidth, pageHeight);
        matrix.rotate(Math.toRadians(180));
        break;
    case 270:
        matrix.translate(0, pageHeight);
        matrix.rotate(Math.toRadians(270));
        break;
    // 0度(纵向)无需额外变换
}
canvas.transform(matrix);

内容的提问来源于stack exchange,提问作者MaxDen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:22:45