使用iText的PdfAcroForm.GetAllFormFields获取PDF表单数据结果异常
表单数据提取值与PDF外观显示不符:是iText问题还是PDF本身问题?
我有一份strangeform.pdf文件,使用iText 8.0.3版本的C#代码提取表单数据时,发现字段T50-1的提取值与PDF表单外观显示的预期值不符,具体情况如下:
使用的提取代码
using iText.Forms.Fields; using iText.Forms; using iText.Kernel.Pdf; using System.Text; PdfDocument pdfDoc = new PdfDocument(new PdfReader(@"strangeform.pdf")); PdfAcroForm form = PdfFormCreator.GetAcroForm(pdfDoc, true); StringBuilder stringBuilder = new StringBuilder(); var data = form.GetAllFormFields(); foreach (var field in data) { if (!string.IsNullOrEmpty(field.Value.GetValueAsString())) stringBuilder.AppendLine($"{field.Key},{field.Value.GetValueAsString()}"); } Console.WriteLine(stringBuilder.ToString()); Console.ReadKey();
提取结果
T36,楊宏章 T37,hello T50-2,123楊宏章 T50-1,楊宏章123ab
其中字段T50-1的提取值为楊宏章123ab,但PDF表单外观显示的预期值是12楊宏章123。
问题根源判断
这种情况大概率是PDF文件本身的问题,核心原因是PDF表单的底层存储值与外观显示内容是相互独立的两个部分:
- iText的
GetValueAsString()方法是严格按照PDF规范读取字段的/V(Value)条目,也就是表单字段的底层存储数据,这是标准的表单数据提取逻辑,符合PDF规范,一般不会是iText的bug。 - 当PDF表单被编辑后,如果没有同步更新字段的底层存储值,或者外观流(
/AP字典内容)被手动修改但未同步底层数据,就会出现「显示值与提取值不一致」的情况。
验证方法
用Adobe Acrobat打开该PDF,进入表单编辑模式:
- 如果Acrobat中编辑框内的实际内容与iText提取的
楊宏章123ab一致,说明PDF的底层存储值和外观显示流未同步,属于PDF本身的问题; - 如果Acrobat中显示的内容与外观一致但编辑时实际内容不符,同样证明是PDF的外观流与存储值脱节导致的问题。
内容的提问来源于stack exchange,提问作者hjyanghj
相关产品推荐
相关产品推荐

