PDFBox文本矩阵缩放行为



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

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

我使用的是带有sbt:"org.apache.pdfbox" % "pdfbox" % "2.0.11"的PDFBox 2.0.11

我的第一步是创建一个内容流,并在PDF上写下"你好世界",我用以下方法完成了这项工作:

// 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()之外,我看不出还有什么能得到当前的转换矩阵状态,但无论我是在追加还是覆盖,它似乎都会返回标识,所以我不认为就是这样。此外,如果我使用与上一个块中最后一行完全相同的调用来应用另一个文本矩阵,它似乎会相对于上一个缩放比例缩放它,所以我最终得到的第二个文本块缩放得太小,看不见。

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

谢谢!

这似乎就是问题所在。我以前没有看到resetContext具有第5个参数的构造函数。不过,如果出于某种原因需要做一些与当前上下文相关的事情,我仍然不确定你将如何获得当前上下文。在我的例子中,添加第五个参数就解决了问题。

PDFBox:PDFPageContentStream';s附加模式错误

最新更新