PDFBox 3.0.0-alpha3使用Wingdings字体绘复选框/单选框报错求助
解决PDFBox使用Wingdings字体绘制复选框/单选框的字形缺失问题
问题根源
Wingdings是专用符号字体,它的字符映射和标准Unicode字符集不匹配。你使用的\u2610(空心复选框)和\u25CF(实心圆)属于标准Unicode符号,但Wingdings字体里这些码点并没有对应的字形,而是用ASCII范围内的字符码来映射符号。
解决方案1:使用Wingdings字体对应的正确字符码
根据Wingdings的字符映射表,常用符号对应的字符:
- 空心复选框:对应ASCII
0x52(即字符'R') - 实心单选框:对应ASCII
0x7C(即字符'|')
修改后的代码如下:
public static void main(String[] args) throws Exception { try(PDDocument document = new PDDocument()){ PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); File fontFile = new File("Wingdings-Regular-Font.ttf"); PDType0Font font = PDType0Font.load(document, fontFile); PDPageContentStream contentStream = new PDPageContentStream(document, page); // 空心复选框(Wingdings中对应字符'R') contentStream.beginText(); contentStream.setFont(font, 16); contentStream.newLineAtOffset(100, 700); contentStream.showText("R"); contentStream.endText(); // 实心单选框(Wingdings中对应字符'|') contentStream.beginText(); contentStream.setFont(font, 16); contentStream.newLineAtOffset(100, 650); contentStream.showText("|"); contentStream.endText(); contentStream.close(); document.save("output.pdf"); } }
解决方案2:直接用PDFBox绘图API绘制(更可靠)
如果不想依赖字体文件,也可以直接用PDFBox的绘图功能绘制复选框和单选框,避免字体兼容性问题:
public static void main(String[] args) throws Exception { try(PDDocument document = new PDDocument()){ PDPage page = new PDPage(PDRectangle.A4); document.addPage(page); PDPageContentStream contentStream = new PDPageContentStream(document, page); float size = 16; // 绘制空心复选框 contentStream.setLineWidth(1f); contentStream.addRect(100, 700 - size, size, size); contentStream.stroke(); // 绘制实心单选框 contentStream.addCircle(100 + size/2, 650 - size/2, size/2); contentStream.fill(); contentStream.close(); document.save("output.pdf"); } }
说明
- 方案1需要确保Wingdings字体文件路径正确,且字体版本对应的字符映射一致;
- 方案2不依赖外部字体,兼容性更强,适合需要稳定输出的场景。
内容的提问来源于stack exchange,提问作者rahim soufiane
相关产品推荐
相关产品推荐

