我试图在我的PDF文档中绘制一个复选标记(在PDF标准ZapfDingbats字体,Unicode 2714中找到)。我是Apache的PDFBox的新手,目前使用的是2.0.0版(没有特别的原因,除了它是最新的)。
我的代码如下:
PDDocument document = PDDocument.load(new File("myfile.pdf"));
PDPage page = document.getPages().get(0); // first page
PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true);
PDType1Font font = PDType1Font.ZAPF_DINGBATS;
String glyph = "\u2714";
contentStream.beginText();
contentStream.setFont(font, fontSize);
contentStream.newLineAtOffset(10, 10); // towards lower left corner of page
contentStream.showText(glyph);
contentStream.endText();
contentStream.close();
document.save("output.pdf");
document.close();
...但这会产生一个很好的例外:
Exception in thread "main" java.lang.IllegalArgumentException: U+2714 ('a20') is not available in this font's encoding: WinAnsiEncoding
at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:345)
at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:286)
:
通过代码调试显示PDType1Font.java:345
处发生的事情是:
PDType1Font extends PDSimpleFont
)PDSimpleFont.glyphList
正确包含从Unicode代码点(U + 2714)到PDF名称(“a20”)的映射,如异常文本中所示(在PDSimpleFont
的构造函数中设置ZapfDingbat字形)。PDSimpleFont.encoding
的构造函数行110中设置为WinAnsiEncoding
的{{1}}不包含名称PDType1Font
- 这些名称(编码) )在a20
类中静态设置 - 请参阅第36行的WinAnsiEncoding
常量。有没有人使用PDFbox管理过显示Dingbat字形 - 即使版本较低?
答案 0 :(得分:0)
我怀疑这是一个错误(根据“ZapfDingbats设置和编码”,a20应该转换为064,我无法找到这样做的地方),请在JIRA中打开一个问题。与此同时,如果你正在使用windows,这是一个解决方法:
而不是
PDType1Font font = PDType1Font.ZAPF_DINGBATS;
使用
PDFont font = PDType0Font.load(document, new File("c:/windows/fonts/arialuni.ttf"));
确实发现这是一个错误,JIRA issue PDFBOX-3298解决了这个问题。现在,在PDFbox版本2.0.3和2.1.0中已解决。