当前位置: 首页 > 知识库问答 >
问题:

使用仿射变换的PDFbox到iText坐标转换

郗学
2023-03-14

我似乎无法让一种坐标格式与另一种格式配合使用。我想我只是没有使用正确的矩阵,但我对它们的了解还不够确定。我希望得到一些帮助,弄清楚我是否在假设我的转换应该是什么。

iText使用左下角作为ISO标准的原点,但pdfbox代码和从pdf中获取坐标的程序都使用左上角作为原点。

我应该做什么转换来调整坐标,以便iText能够以一种有效的方式使用它们?

我有一些代码,使用pdfbox来操作pdf并去除一些数据,现在我需要将修改后的数据注入到页面上。PDFBox的作者一直在破坏pdf,所以我们决定使用iText进行注入。

诀窍是我在pdfbox中使用的坐标(以及我们从生成pdf的系统中获得的坐标)似乎与iText的不匹配。

我检查了一下,iText页面和cropbox似乎都是准确的:

  PdfReader splitPDFDocumentReader = new PdfReader(splitPDFdocumentName);

  com.lowagie.text.Rectangle theCropBox = splitPDFDocumentReader.getCropBox(1);
  com.lowagie.text.Rectangle thePageSize = splitPDFDocumentReader.getPageSize(1);

  consolePrintln("Cropbox: " + theCropBox.toString());
  consolePrintln("\tBottom " + theCropBox.getBottom());
  consolePrintln("\tLeft " + theCropBox.getLeft());
  consolePrintln("\tTop " + theCropBox.getTop());
  consolePrintln("\tRight " + theCropBox.getRight());

  consolePrintln("PageSize: " + thePageSize.toString());
  consolePrintln("\tBottom " + thePageSize.getBottom());
  consolePrintln("\tLeft " + thePageSize.getLeft());
  consolePrintln("\tTop " + thePageSize.getTop());
  consolePrintln("\tRight " + thePageSize.getRight());

输出:

Cropbox: Rectangle: 612.0x792.0 (rot: 0 degrees)
    Bottom 0.0
    Left 0.0
    Top 792.0
    Right 612.0
PageSize: Rectangle: 612.0x792.0 (rot: 0 degrees)
    Bottom 0.0
    Left 0.0
    Top 792.0
    Right 612.0

这会让我相信这只是翻转y坐标的问题,因为pdfbox的原点在左上角,而iTexts在左下角。

当我应用转换时:

  //  matrix data example:
  //  [m00, m01, m02,
  //   m10, m11, m12,
  //   0  , 0  , 1   ]  // this bit is implied as part of affineTransform docs
  content.saveState();
  int m00 = 1;
  int m01 = 0;
  int m02 = 0;
  int m10 = 0;
  int m11 = -1;
  int m12 = 0;

  content.concatCTM(m00, m10, m01, m11, m02, m12);

  content.setColorStroke(Color.RED);
  content.setColorFill(Color.white);
  content.rectangle(x, y, x + height, y + width);
  content.fillStroke();

  content.restoreState();

它似乎没有做到我所期望的。似乎数据完全在页面之外。

说实话,我对矩阵不是很在行,也许我需要做一些翻译工作,而不是像我尝试过的那样只填写y?

concatCTM函数似乎采用与awt.geom.affinetransform相同的格式,我将通过这个示例和教程来使用转换。

共有1个答案

花永昌
2023-03-14

我想通了。当我摆动y坐标时,我假设它会翻转文档中间并颠倒所有内容。然而,它实际上翻转了y=0行;

翻转y=0后,需要将整个页面向上移动。

最后,我直接使用仿射变换来完成它,然后将生成的矩阵输入concatCTM。

content.saveState();

AffineTransform transform = new AffineTransform();

transform.scale(1, -1); // flip along the line y=0
transform.translate(0, -pageHeight); // move the page conet back up

/* the version of iText used in Jasper iReport doesn't seem to use affineTransform directly */
double[] transformMatrix = new double[6];
transform.getMatrix(transformMatrix);

content.concatCTM((float) transformMatrix[0], (float) transformMatrix[1], (float) transformMatrix[2], (float) transformMatrix[3], (float) transformMatrix[4], (float) transformMatrix[5]);

// drawing and printing code here (stamping?)

content.restoreState();
 类似资料:
  • 我有一个使用pdf的react应用程序。来自mozilla的js,突出显示一个单词或句子,并在突出显示的部分添加注释。 他们正在将突出显示部分的坐标发送到java服务中。在java方面,我们需要使用iText在pdf中突出显示并添加注释。 这里的问题是pdf格式。js从屏幕左上角计算坐标(即0,0从屏幕左上角开始),而在iText中,从屏幕左下角计算坐标。 所以有人能告诉我如何映射的坐标从pdf.

  • 我正在使用PDFBox的在Java中显示PDF页面。我正试图基于页面中的(即AcroForm字段)在PDF页面的图像上创建可点击的区域。问题是PDF似乎使用了一个完全不同的坐标系: 收益率 如果我要估计图像上字段矩形的实际尺寸,它将是40,40,50,10(x,y,宽度,高度)。这两者之间没有明显的相关性,我似乎找不到任何关于这一点的信息与谷歌。 如何确定PDPage的cosobects的像素位置

  • 给定的是一个旋转的矩形,该矩形内接到另一个矩形中<两个矩形都有自己的坐标系 在该区域中 我对变换矩阵的尝试(setRotate() 如何计算P点相对于外矩形的位置? 提前感谢!

  • 我有一个名为的类。在这个类中,我有变量,它是类型。此外,我还有类,它重写函数: 我的airplane.rotateAirplane()函数如下所示: 当我运行我的程序时,只绘制对象。当我删除这条车道时 我也有我的飞机,但没有旋转。

  • 在第三章“图层几何学”中,我们使用了UIView的transform属性旋转了钟的指针,但并没有解释背后运作的原理,实际上UIView的transform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵(见图5.1)。 图5.1 用矩阵表示的CGAffineTra

  • 本文向大家介绍使用OpenCV实现仿射变换—旋转功能,包括了使用OpenCV实现仿射变换—旋转功能的使用技巧和注意事项,需要的朋友参考一下 在前面实现了平移和缩放,还有一种常用的坐标变换,那就是旋转。比如拍摄的照片上传到电脑里,再打开时发现人的头在下面脚在上,这样肯定看不了,那么就需要把这个照片旋转180度才可以接受。由于旋转变换,都是绕着点进行运动的,首先要找到轴的位置,默认是原点(0,0),如