PDFBox 文本矩阵缩放行为

PDFBox text matrix scaling behavior

我在尝试在页面的内容流中追加文本时无法理解 PDFBox 的行为。我正在使用样本扫描的 PDF,它只是一个覆盖在页面上的光栅图像。我对 PDF 内部的工作知识有些基础,所以我可能走错了路。

http://solutions.weblite.ca/pdfocrx/scansmpl.pdf

我正在使用 PDFBox 2.0.11 sbt"org.apache.pdfbox" % "pdfbox" % "2.0.11"

我的第一步是创建一个内容流并在 PDF 上写入 "hello world",我通过以下方式完成:

// val pdf: PDDocument
val page = pdf.getPages(0)
val contentStream = new PDPageContentStream(pdf, page, false, true)
contentStream.beginText()
contentStream.newLineAtOffset(0, 0)
contentStream.setFont(PDType1Font.COURIER, 12)
contentStream.showText("Hello, world!")
contentStream.endText()
contentStream.close()

这行得通,文本显示在左下角,这是我预期的位置。但它当然会覆盖光栅图像,这不是我想要的。因此,我将 PDPageContentStream 构造函数更改为 (pdf, page, true, true) 以使其附加到内容流。

现在我遇到了我不理解的奇怪行为。文本显示 巨大 。太大以至于我只能看到 H 的底角,因为它至少比页面本身大 10 倍。我想这意味着正在发生一些悬空矩阵变换?我不确定我是否完全理解 PDF 中的转换操作是如何工作的。 PDFBox 似乎暗示调用 setTextMatrix 会用新矩阵替换现有矩阵,而不是相对于现有文本矩阵。我可以通过以下方式使文本可见(并接近正常大小):

val affine = new AffineTransform()
affine.setToIdentity()
affine.scale(0.002, 0.002)
// code
contentStream.setTextMatrix(new Matrix(affine))

这是我通过反复试验才发现的。无论如何,除了页面范围 .getMatrix() 之外,我看不到当前转换矩阵状态,但无论我是追加还是覆盖,这似乎 return 身份,所以我不t认为就是这样。此外,如果我应用另一个文本矩阵,其调用与前一个块中的最后一行完全相同,它似乎会相对于前一个比例进行缩放,所以我最终会得到第二个文本块,它被缩放得太小以至于看不见。

如何获取当前变换矩阵,以便我可以将其反转以达到实际所需的缩放比例?

谢谢!

看来这就是问题所在。我之前没有看到带有 resetContext 第 5 个参数的构造函数。不过,如果您出于某种原因需要做一些与该上下文相关的事情,我仍然不确定您将如何获得当前上下文。就我而言,添加第 5 个参数可以解决问题。