You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字符:

  1. 首先加载Wingdings字体(确保字体文件可访问,或使用系统内置的Wingdings字体名)
  2. 为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:45:09