0

问题:

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

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相同的格式,我将通过这个示例教程来使用转换。

4

1 回答 1

2

我想到了。当我翻转 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();
于 2013-05-01T14:23:21.413 回答