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

如何为iText 7.1.0 Java版的PdfWidgetAnnotation设置字体与字号?

解决iText中PdfWidgetAnnotation的字体与字号设置问题

Hey Dirk,刚好我对iText的表单字段配置比较熟悉,你的问题其实是因为字体设置并不直接在PdfWidgetAnnotation上,而是关联到表单字段(PdfFormField)或者整个AcroForm的默认配置上,Widget会自动继承这些设置。下面给你两种可行的方案:

方案一:给整个AcroForm设置全局默认字体

如果你希望所有生成的表单控件都用统一的字体和字号,可以直接给PdfAcroForm设置默认字体,这样所有字段都会自动继承:

修改你的代码,添加字体创建和全局默认设置:

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.forms.fields.PdfTextFormField;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.annot.PdfAnnotation;
import com.itextpdf.kernel.pdf.annot.PdfWidgetAnnotation;

public class problem5 {
    public static void main(String[] args) throws IOException {
        String fnPdf = "results/problem5.pdf";
        PdfWriter writer = new PdfWriter(fnPdf);
        PdfDocument pdf = new PdfDocument(writer);
        PdfPage page = pdf.addNewPage();
        PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
        
        // 创建你需要的字体(这里用默认Helvetica,也可以传入自定义字体路径)
        PdfFont defaultFont = PdfFontFactory.createFont();
        // 设置全局默认字体,字号12(第二个参数为字号)
        form.setFont(defaultFont, 12);
        
        // field
        PdfTextFormField field = PdfFormField.createText(pdf);
        field.setFieldName("fName");
        
        // widget 1
        Rectangle rect1 = new Rectangle(40, 750, 150, 20);
        PdfWidgetAnnotation widget1 = new PdfWidgetAnnotation(rect1);
        widget1.makeIndirect(pdf);
        widget1.setFlag(PdfAnnotation.PRINT);
        page.addAnnotation(widget1);
        field.addKid(widget1);
        
        // widget 2
        Rectangle rect2 = new Rectangle(240, 750, 150, 20);
        PdfWidgetAnnotation widget2 = new PdfWidgetAnnotation(rect2);
        widget2.makeIndirect(pdf);
        widget2.setFlag(PdfAnnotation.PRINT);
        page.addAnnotation(widget2);
        field.addKid(widget2);
        
        // field
        field.setValue("Dirk");
        form.addField(field, page);
        
        // ----
        pdf.close();
        Desktop.getDesktop().open(new File(fnPdf));
    }
}

方案二:给单个字段设置独立字体

如果你只想给特定字段(比如这个fName)设置字体,可以直接给PdfTextFormField设置,它的所有子Widget都会继承这个设置:

在创建字段后添加以下代码即可:

// 给单个字段设置字体和字号
field.setFont(defaultFont);
field.setFontSize(14);

为什么Widget本身没有字体属性?

简单说,PdfWidgetAnnotation只是负责渲染字段的可视化区域,真正的内容样式(字体、字号、颜色)都是由所属的表单字段(PdfFormField)控制的。字段会把样式信息写入默认外观字符串(DA),Widget读取这个信息来渲染内容,所以直接操作Widget是找不到字体设置入口的~

这样修改后,你的两个fName控件就会使用你指定的字体和字号啦!

内容的提问来源于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:15:38