iText 7.1.0 Java版:Adobe Reader DC复选框打印等问题咨询
咱们逐个解决这三个iText AcroForm CheckBox的问题:
问题1:选中状态的CheckBox无法在Adobe Reader DC打印,是否因缺少ZapfDingsbats字体?
没错,这大概率和ZapfDingsbats字体有关。iText默认使用该字体渲染CheckBox的选中符号,但如果没有将字体嵌入PDF,且本地系统未安装ZapfDingsbats,Adobe Reader在打印时就无法正确解析并渲染选中标记。
解决思路:
- 要么将ZapfDingsbats字体嵌入PDF,确保Reader能直接获取字体数据
- 要么替换成系统更普及的字体(比如你提到的Wingdings,正好能解决后面的第二个问题)
问题2:将CheckBox的选中/未选中符号替换为Wingdings字体
要替换字体,你需要加载Wingdings字体,并为CheckBox的不同状态指定对应的Wingdings字符:
- 首先加载Wingdings字体(确保字体文件可访问,或使用系统内置的Wingdings字体名)
- 为CheckBox设置该字体,并自定义
On(选中)和Off(未选中)状态的字符
示例代码片段:
// 加载Wingdings字体,开启嵌入确保打印正常 PdfFont wingdings = PdfFontFactory.createFont("Wingdings", PdfEncodings.WINANSI, true); // 创建CheckBox后,设置字体 checkBox.setFont(wingdings); // 自定义状态字符:Wingdings中对勾是\u0052,叉是\u0054,未选中用空格占位 checkBox.setAppearanceState("On", "\u0052"); checkBox.setAppearanceState("Off", " ");
问题3:为未选中的CheckBox绘制边框
默认情况下,未选中状态的CheckBox可能没有边框,你有两种方式实现:
方法1:直接设置字段边框属性
通过字段的内置方法设置边框宽度和颜色,同时开启打印标志确保边框能被打印:
checkBox.setBorderWidth(1); // 边框宽度1pt checkBox.setBorderColor(new DeviceGray(0)); // 黑色边框 checkBox.setFieldFlag(PdfFormField.PRINT, true); // 强制打印该字段
方法2:自定义未选中状态的外观
如果默认边框不生效,可以直接绘制未选中状态的外观画布:
// 获取未选中状态的外观画布 PdfCanvas offCanvas = new PdfCanvas(checkBox.getAppearanceDictionary().getAsDictionary(PdfName.Off)); // 绘制矩形边框 offCanvas.rectangle(75, 750, 20, 20); // 对应CheckBox的坐标和尺寸 offCanvas.setStrokeColor(new DeviceGray(0)); offCanvas.stroke();
整合后的完整代码
package jumpstart; import java.awt.Desktop; import java.io.File; import java.io.IOException; import com.itextpdf.forms.PdfAcroForm; import com.itextpdf.forms.fields.PdfButtonFormField; import com.itextpdf.forms.fields.PdfFormField; import com.itextpdf.kernel.colors.DeviceGray; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfName; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.pdf.PdfEncodings; public class Problem6 { public static void main(String[] args) throws IOException { PdfWriter writer = new PdfWriter("problem6.pdf"); PdfDocument pdf = new PdfDocument(writer); PdfPage page = pdf.addNewPage(); PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true); // 加载并嵌入Wingdings字体,解决打印和字体替换问题 PdfFont wingdings = PdfFontFactory.createFont("Wingdings", PdfEncodings.WINANSI, true); // 创建CheckBox PdfButtonFormField checkBox = PdfFormField.createCheckBox(pdf, new Rectangle(75, 750, 20, 20), "cbName1", "On", PdfFormField.TYPE_CROSS); // 设置字体及状态符号 checkBox.setFont(wingdings); checkBox.setAppearanceState("On", "\u0052"); // Wingdings对勾 checkBox.setAppearanceState("Off", " "); // 设置边框并开启打印标志 checkBox.setBorderWidth(1); checkBox.setBorderColor(new DeviceGray(0)); checkBox.setFieldFlag(PdfFormField.PRINT, true); // 额外自定义未选中状态的边框(可选,确保万无一失) PdfCanvas offCanvas = new PdfCanvas(checkBox.getAppearanceDictionary().getAsDictionary(PdfName.Off)); offCanvas.rectangle(75, 750, 20, 20); offCanvas.setStrokeColor(new DeviceGray(0)); offCanvas.stroke(); form.addField(checkBox, page); pdf.close(); Desktop.getDesktop().open(new File("problem6.pdf")); } }
内容的提问来源于stack exchange,提问作者Dirk Kampfmeier
相关产品推荐
相关产品推荐

