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



我正试图找出如何找到以前用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

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

我的问题是,对于我可能使用的任何其他字体或大小,我如何计算"3.54"是什么。我可以从iText获得帮助吗?或者它只是"将Helvetica的字体大小乘以0.44,将Courier的字体大小相乘0.35,等等"?

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

谢谢!

如果您让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内容流中的文本不适用于此类编辑。你可以在这里找到很多关于堆栈溢出的问题,这些问题都是那些尝试过的人提出的,但在看似轻松的开局后遇到了麻烦。阅读这个答案,列举一些障碍。

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

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

最新更新