查找我使用 iText 7 添加到 PDF 的文本

Finding text I've added to a PDF with iText 7

我想知道如何找到我之前使用 iText7 添加到 PDF 中的文本。

我正在玩 iText7,并且有以下代码:

static void Main(string[] args)
{
  PdfDocument pdfDocument = new PdfDocument(new PdfWriter("./test.pdf"));
  pdfDocument.AddNewPage(PageSize.LETTER.Rotate());

  Document document = new Document(pdfDocument);

  PdfFont helv = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);

  Paragraph paragraph = new Paragraph("test string");
  paragraph.SetFont(helv);
  paragraph.SetFontSize(8);
  paragraph.SetFixedPosition(500, 194, 100);
  document.Add(paragraph);
  document.Close();

  return;
}

然后我 运行 不同的代码来获取流,它显示了以下内容:

q
BT
/F1 8 Tf
500 197.54 Td
(test string)Tj
ET
Q

值得注意的是,我将 Y 位置指定为 194,生成的 PDF 显示为 197.54。如果我将(用户提供的)文本添加到 PDF,然后想稍后返回并用其他内容替换该文本,我可以知道,至少对于特定的 font/size,我必须添加 3.54我最初指定的 Y;我假设这与指定文本块底部的字体基线 v.iText 有关。

我的问题是,对于我可能使用的任何其他字体或大小,我如何计算“3.54”是多少。有没有我可以从 iText 获得的信息来帮助我,还是只是 "multiply the font size by 0.44 for Helvetica, and 0.35 for Courier, etc"?

到目前为止,也许只是运气好,我还没有发现将一串文本拆分成不同的 Td/Tj 命令有任何问题,所以我将忽略这个潜在的未来问题暂时。

谢谢!

如果您让 iText 确定文本的布局,即使使用 SetFixedPosition,该计算中也会有很多值,特别是字体下降、行距、填充和边距,...

这些复杂功能最重要的是能够模拟 HTML/CSS-like 文本类型设置功能。

此外,iText 对其写入内容流的数字应用舍入。

如果您反而希望能够轻松识别您提供的位置,不要让 iText 确定文本的布局,而是您自己来确定并使用坐标,这不会'不会因四舍五入而受到伤害,例如而不是

Paragraph paragraph = new Paragraph("test string");
paragraph.SetFont(helv);
paragraph.SetFontSize(8);
paragraph.SetFixedPosition(500, 194, 100);
document.Add(paragraph);

PdfCanvas canvas = new PdfCanvas(pdfDocument, 1);
canvas.BeginText()
      .SetFontAndSize(helv, 8)
      .MoveText(100, 194)
      .ShowText("test string")
      .EndText();

这导致

BT
/F1 8 Tf
100 194 Td
(test string) Tj
ET

让您立即识别您的坐标。

(当然这意味着y值不是文本的最底部而是它的基线。)


话虽如此,您提到您想稍后返回并用其他内容替换该文本。请允许我反对这样做。 PDF 内容流中的文本不适用于此类编辑。您可以在这里找到许多尝试过堆栈溢出的人提出的问题,并且 运行 在看似容易的开始后陷入困境。阅读 列举一些 hind运行ces.

即使您只想编辑您自己创建的文档并因此在一定程度上控制其中的后运行ces,您也​​无法避免此类问题,例如库更新后。

另一种方法是使用 AcroForm 表单字段(您可以将其设置为只读以防止意外操作,甚至可以在不再需要更改时立即将其展平)。