AcroFields读取不到字段是因为PDF未嵌入AcroForm结构;填充失败主因是字段只读、JavaScript覆盖、字段名错误或中文字体未嵌入。

AcroFields 读取不到字段?检查 PDF 是否真含 AcroForm
很多 PDF 看起来有表单域(比如带边框的空白框),但用 AcroFields 读不出字段——根本原因是该 PDF 并未嵌入标准 AcroForm 结构,只是图像或静态文本。这类文件常见于扫描件、导出时未勾选“启用表单域”的 Word 转 PDF。
实操建议:
- 用 Adobe Acrobat 打开 PDF → 右键任意表单区域 → 若无「属性」或「编辑字段」选项,基本可判定无 AcroForm
- 代码中先检查
pdfReader.AcroFields是否为null或pdfReader.AcroFields.Fields.Count == 0 - iTextSharp 5.x 中,
pdfReader.AcroFields仅解析 /AcroForm 字典下的字段,不识别 XFA 表单(哪怕扩展名是 .pdf)
iTextSharp 5.x 填充 AcroFields 的最小可行代码
不是所有字段都能直接赋值;AcroFields 对字段类型敏感,且必须在写入前关闭只读状态。
实操建议:
- 用
Stamper.FormFlattening = false保留可编辑性;设为true后字段将被“压平”成普通内容,无法再修改 - 字段名区分大小写,且可能含前缀如
TextField.1,建议先用AcroFields.Fields.Keys枚举确认真实名称 - 对
TextBox类型字段,用SetField("name", "value");对CheckBox,需传"Yes"或"Off"(不是true/false)
var reader = new PdfReader(inputPath);
var stamper = new PdfStamper(reader, new FileStream(outputPath, FileMode.Create));
var form = stamper.AcroFields;
form.SetField("FullName", "张三");
form.SetField("Agree", "Yes"); // 注意:不是 true
stamper.FormFlattening = false;
stamper.Close();
reader.Close();
中文乱码?字体没嵌入是主因
填进去的中文显示为方块或空格,大概率不是编码问题,而是 PDF 表单字段未指定支持中文的字体,或字体未嵌入。
实操建议:
- 字段本身需预设字体:在 Acrobat 中右键字段 → 属性 → 「选项」→ 勾选「需要嵌入字体」,并指定如
SimSun或Microsoft YaHei - 代码中可强制指定字体:用
BaseFont.CreateFont("C:\Windows\Fonts\simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)不起作用;必须用NOT_EMBEDDED仅当 PDF 已含该字体子集,否则应改用EMBEDDED - iTextSharp 5.5+ 支持
SetFieldProperty设置字体,但前提是字段原生支持该字体;更稳的方式是让设计 PDF 时就嵌入字体
为什么 SetField 没生效?留意字段只读和 JavaScript 阻断
调用 SetField 返回 true 不代表成功写入——它只表示字段存在且类型匹配。实际渲染失败常因字段被设为只读,或 PDF 内嵌 JavaScript 在 onCalculate/onBlur 里覆盖了值。
实操建议:
- 检查字段属性:
form.GetFieldItem("name").GetMerged(0).Get(PdfName.FF) & PdfFormField.FF_READONLY是否非零 - 临时禁用 JS:设置
stamper.JavaScript = null(iTextSharp 5.x),或用reader.RemoveJavaScript()(需手动操作底层字典) - 填充后务必调用
stamper.Close(),否则缓冲未刷新,输出文件仍为原始内容
AcroFields.Fields.Keys 和字段属性,别急着改代码逻辑。



















