横向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
相关产品推荐
相关产品推荐

