如何使用iText7填充同名表单域且不丢失原有格式
解决iText7填充同名差异化格式PDF表单域的问题
你的问题出在:form.GetAllFormFields()会把同名的多个可视化域合并成一个PdfFormField对象,直接调用SetValue会统一应用该字段的默认格式,导致各个域原有的字体、字号等差异化设置被覆盖。
要保留每个域的原有格式,你需要遍历每个可视化widget(每个对应一个独立的表单域实例),单独设置值并保留其外观:
修改后的代码如下:
Dictionary<string, string> fieldValues = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); fieldValues["testField"] = "This is a value"; using (PdfReader reader = new PdfReader(sourcePdf)) { using (PdfWriter writer = new PdfWriter(destPdf)) { using (PdfDocument document = new PdfDocument(reader, writer)) { PdfAcroForm form = PdfAcroForm.GetAcroForm(document, false); if (form == null) return; // 遍历所有表单可视化组件(widget) foreach (PdfWidgetAnnotation widget in form.GetFieldWidgets()) { if (widget.GetField() is PdfTextFormField textField) { string fieldName = textField.GetFieldName().ToString(); if (fieldValues.TryGetValue(fieldName, out string value)) { // 第三个参数传false,不重置widget的原有外观格式 textField.SetValue(value, widget, false); } } } } } }
关键说明:
- 使用
form.GetFieldWidgets()获取所有独立的可视化表单组件,而非合并后的字段对象 - 调用
SetValue(string value, PdfWidgetAnnotation widget, bool resetAppearance)重载,第三个参数设为false,强制保留该widget原有的字体、字号等格式 - 移除了手动调用
Close()的代码,using语句会自动释放资源,更简洁安全
内容的提问来源于stack exchange,提问作者Pickle Guy
相关产品推荐
相关产品推荐

