如何在Itext生成的可编辑PDF中修改被用户改动的表单域样式
实现方案
PDF内置的JavaScript API本身支持直接修改表单域样式,你之前无法修改是因为附加动作绑定逻辑和JS代码写的不对,以下是可直接运行的实现:
修正点说明
- 你原有代码中
setAdditionalAction方法重复定义了PdfAction,第二个JS代码实际没有绑定到值变更事件上 PdfName.V对应的就是表单域值变更触发的动作,直接把样式修改逻辑写在该动作绑定的JS里即可- 可以先给表单域预设初始值的自定义属性,用于后续比对用户是否修改了内容
完整修正代码
PdfTextFormField champTempsMinutes = PdfTextFormField.createMultilineText( pdfDocument, new Rectangle(currentX, currentY, 20f, 14f), "champTempsMinutes", "_ _"); champTempsMinutes.setFontAndSize(fontHelvetica, 8); champTempsMinutes.setJustification(1); champTempsMinutes.setFieldName("toto"); // 绑定值变更触发的动作,实现样式修改 champTempsMinutes.setAdditionalAction( com.itextpdf.kernel.pdf.PdfName.V, PdfAction.createJavaScript( "// 首次触发时先存初始值到自定义属性\n" + "if (!event.target.defaultVal) event.target.defaultVal = '_ _';\n" + "// 对比当前值和初始值\n" + "if (event.value !== event.target.defaultVal) {\n" + " // 修改为黄色背景\n" + " event.target.fillColor = color.yellow;\n" + " // 修改字体为Helvetica加粗\n" + " event.target.textFont = font.HelvB;\n" + "} else {\n" + " // 改回初始样式,透明背景,普通字体\n" + " event.target.fillColor = color.transparent;\n" + " event.target.textFont = font.Helv;\n" + "}" ) );
其他可修改的样式属性
如果你需要其他标识效果,可以修改对应的JS属性:
event.target.borderColor = color.red:修改边框为红色event.target.textColor = color.red:修改文字为红色event.target.bold = true:直接设置文字加粗(兼容大部分主流PDF阅读器)
内容的提问来源于stack exchange,提问作者Vatchemao
相关产品推荐
相关产品推荐

