【问题标题】:Filling Acrofield does not work as intended填充 Acrofield 无法按预期工作
【发布时间】:2026-01-29 16:30:01
【问题描述】:

我很难解决这个问题。我有一个带有字段的 PDF 文件,因此用户可以填写它们。

我正在使用 iTextSharp(在 vb.net 上)打开 PDF 文件,读取字段并将数据写回(并将其显示给用户)。

文档没有被锁定,也没有任何安全措施。

我是这样读的:

Dim readerPDF As New PdfReader(Application.StartupPath & "\PDF\" & filename)
Dim pathTemp = IO.Path.GetTempFileName & ".pdf"
Dim stamperPDF As New PdfStamper(readerPDF, New IO.FileStream(pathTemp, IO.FileMode.Create))
Dim pdfFormFields As AcroFields = stamperPDF.AcroFields 

然后我只需循环 pdfFormFields(我已经将每个字段的密钥保存在数据库中。

For each f as field_keys 
    pdfFormFields.SetField(f, "dummy text")
Next

这对每个文本输入都很有效,没有问题。当我有一个多行字段时,这会很糟糕。

使用这种方法填充给了我:

但如果我用 Adob​​e Reader 打开原始 PDF 文件并写下相同的内容,我会得到:

所以...我什至不知道如何在互联网上查找。 iTextSharp 是不支持这个还是我错过了什么?

编辑: Link to PDF

编辑: itext dll 已过时。下载最新的,问题依旧。

【问题讨论】:

  • 你能分享有问题的pdf吗?
  • @mkl 谢谢!我已经添加了 Q 的链接。

标签: vb.net pdf itext acrofields


【解决方案1】:

问题可能与多行字段的属性有关。一个问题可能是你有一个固定的字体,当字段溢出时,它会在屏幕上剪辑文本。如果字体是 Auto,它会在控件填满时缩小字体。

【讨论】:

  • 这就是 Adob​​e Reader 的作用。使用 iText 只需在另一行下方写一行。我的意思是 iText 怎么不能读取字段属性?还是只有 Adob​​e 可以?
  • iText 不在图片中 - 如果我是对的。这些属性特定于 PDF 表单域的定义方式。
  • 那么我是 SOL 使用 iText 吗?
【解决方案2】:

要理解的一点是,在 PDF 中,字段的值和字段的视觉外观是两个非常不同的东西。在 PDF 查看器不知道字段或其值是什么的情况下,字段外观用于显示该字段。我相信您所看到的原因是,Adobe Reader 生成外观的方式与 iText 生成外观的方式之间存在一些次要...和主要...差异。要测试我的理论,只需在 Adob​​e Reader 中编辑该字段并查看问题是否自行纠正。如果是这样,iText 中的外观生成器就是问题。

【讨论】:

  • 用 Adob​​e Reader 填充的同一个 PDF 可以正常工作。该行有一个“高度”,并且每个新行都正确写入。使用 iText 以某种方式错过了这一点并继续在下面写......我找不到任何方法来设置行高并且打印断线不起作用。
  • 尝试使用类似 stamper.AcroFields.Xfa.FillXfaForm(sourceXml);这将允许 Acrobat 仅使用数据来格式化字段。