gpt4 book ai didi

java - 使用 AffineTransform 将 PDFbox 转换为 iText 坐标

转载 作者:行者123 更新时间:2023-12-02 07:04:18 25 4
gpt4 key购买 nike

问题:

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

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

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

背景

我有一些代码使用 pdfbox 来操作 pdf 并删除一些数据,现在我需要将修改后的数据注入(inject)回页面上。 PDFBox 的编写器不断损坏 pdf,因此我们决定使用 iText 进行注入(inject)。

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

到目前为止我做了什么

我检查过,iText 页面和裁剪框似乎都是准确的:

  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 相同的格式,我的地址是 this exampletutorial用于使用转换。

最佳答案

我明白了。当我翻转 y 坐标时,我假设它会翻转文档的中间并反转所有内容。然而它实际上翻转了线 y=0;

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

我最终直接使用 affineTransform 来完成它,然后将生成的矩阵输入 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();

关于java - 使用 AffineTransform 将 PDFbox 转换为 iText 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16286952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com