使用下面的代码旋转页面使其水平
PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, false, false);
PDRectangle cropBox = page.getCropBox();
float tx = (cropBox.getLowerLeftX() + cropBox.getUpperRightX()) / 2;
float ty = (cropBox.getLowerLeftY() + cropBox.getUpperRightY()) / 2;
cs.transform(Matrix.getTranslateInstance(tx, ty));
cs.transform(Matrix.getRotateInstance(Math.toRadians(5), 0, 0));
cs.transform(Matrix.getTranslateInstance(-tx, -ty));
cs.close();
由于坐标在仿射变换后发生了变化,对于旧的裁剪框坐标,我得到了不同的部分。我想得到我在旋转之前指向的原始部分。
所以,我尝试了以下技术来获取新坐标,但没有得到结果
double x_transformed = (x*Math.cos(angle))-(y*Math.sin(angle));
double y_transformed = (x*Math.sin(angle))+(y*Math.cos(angle));
double X_transformed = (X*Math.cos(angle))-(Y*Math.sin(angle));
double Y_transformed = (X*Math.sin(angle))+(Y*Math.cos(angle));
题中提供的数据仅供引用,实际输入文件可从以下链接获取:
drive.google.com/open?id=0BxPYWA8sfqTDVmY5YVQyZTZwSTA
提前致谢。
最佳答案
问题是您围绕页面的原始裁剪框(默认为媒体框)中心旋转了页面:
PDRectangle cropBox = page.getCropBox();
float tx = (cropBox.getLowerLeftX() + cropBox.getUpperRightX()) / 2;
float ty = (cropBox.getLowerLeftY() + cropBox.getUpperRightY()) / 2;
然后你限制到你的新裁剪框:
int x = 39;
int y = 450;
int x2 = 360;
int y2= 500;
page.setCropBox(new PDRectangle(new BoundingBox((int)x, (int)y,(int)x2, (int)y2)));
在你的previous question你的任务是保持页面裁剪框的中心固定并旋转它周围的所有内容。因此,从页面裁剪框计算出tx
和ty
是正确的。
另一方面,您现在的任务是将框的中心固定到您最终要裁剪页面的位置。
因此,您现在必须使用另一个框的角来计算 tx
和 ty
:
float tx = (x + x2) / 2;
float ty = (y + y2) / 2;
或者,您可以简单地更改顺序并首先将页面裁剪到 (x,y) 和 (x2,y2) 之间的框,然后围绕更改后的裁剪框的中心旋转。
另一种选择是通过其中心已通过旋转移动的 vector 来更改新的裁剪框坐标。
关于java - 如何在java中使用pdfbox进行仿射变换后获得新坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40756079/