java - 如何在java中使用pdfbox进行仿射变换后获得新坐标

标签 java pdfbox

我有以下带有裁剪框的 pdf,如下所示 enter image description here

使用下面的代码旋转页面使其水平

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();

上面代码的结果是 enter image description here

由于坐标在仿射变换后发生了变化,对于旧的裁剪框坐标,我得到了不同的部分。我想得到我在旋转之前指向的原始部分。

所以,我尝试了以下技术来获取新坐标,但没有得到结果

 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));

请建议我可以准确裁剪所需部分的解决方案。 enter image description here

题中提供的数据仅供引用,实际输入文件可从以下链接获取:

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你的任务是保持页面裁剪框的中心固定并旋转它周围的所有内容。因此,从页面裁剪框计算出txty是正确的。

另一方面,您现在的任务是将框的中心固定到您最终要裁剪页面的位置。


因此,您现在必须使用另一个框的角来计算 txty:

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/

相关文章:

java - setMaxDate() 在 Lollipop 5.0.1 android 上无法完美运行,需要适当的解决方案

python - 从pdf文档中提取文本时是否可以获取行号?

java - PDF 中的文本以不同方式吐出

java - Apache PDFBox : Get alignment and font from a PDAnnotationWidget or PDTextField

java - Android Studio 在我的代码中没有显示任何错误,但 gradle 却显示了。尝试什么

java - 需要一种方法来读取两个文件并使用扫描器类输出差异

java - Pdfbox 签名 - saveIncremental 与 saveIncrementalForExternalSigning

java - 文本居中,不考虑 x 坐标

java - 无法从 web.xml 读取上下文参数

java - Gradle 从类路径上的文件申请?