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 个参数可以解决问题。
我在尝试在页面的内容流中追加文本时无法理解 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 个参数可以解决问题。