如何为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
相关产品推荐
相关产品推荐

