【问题标题】:Finding text I've added to a PDF with iText 7使用 iText 7 查找我添加到 PDF 中的文本
【发布时间】:2020-03-27 03:06:43
【问题描述】:

我正在尝试找出如何查找我之前使用 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 添加(用户提供的)文本,然后想稍后返回并用其他内容替换该文本,我可以知道,至少对于特定的字体/大小,我必须将 3.54 添加到 Y I最初指定;我假设这与字体的基线 v. iText 指定文本块的底部有关。

我的问题是,我如何计算“3.54”对于我可能使用的任何其他字体或大小。有没有我可以从 iText 获得帮助的信​​息,还是只是“将 Helvetica 的字体大小乘以 0.44,Courier 等的字体大小乘以 0.35”?

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

谢谢!

【问题讨论】:

    标签: c# itext7


    【解决方案1】:

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

    这些复杂功能主要是为了能够模拟 HTML/CSS 类文本类型设置功能。

    此外,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 内容流中的文本不适用于此类编辑。你可以在这里找到许多关于堆栈溢出的问题,这些问题是由那些尝试过的人提出的,并且在看似简单的开始后遇到了麻烦。阅读this answer 列举一些障碍。

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

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

    【讨论】:

    • 幸运的是,这只是短期的事情。而且我要编辑的 PDF 最多只能在打印前保留几天,所以我不需要更改比这更早的 PDF 上的某些内容,如果有的话。
    猜你喜欢
    • 2017-04-13
    • 2019-03-26
    • 2017-12-19
    • 2019-01-04
    • 2017-09-17
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多