Java 使用PDFbox从ZapfDingbats绘制图示符

Java 使用PDFbox从ZapfDingbats绘制图示符,java,pdfbox,dingbats,Java,Pdfbox,Dingbats,我试图在我的PDF文档中画一个复选标记(可以在PDF标准ZapfDingbats字体Unicode 2714中找到)。我是Apache的新手,目前正在使用2.0.0版(除了它是最新版本之外,没有具体原因) 我的代码如下所示: PDDocument document = PDDocument.load(new File("myfile.pdf")); PDPage page = document.getPages().get(0); // first page PDPageContentStrea

我试图在我的PDF文档中画一个复选标记(可以在PDF标准ZapfDingbats字体Unicode 2714中找到)。我是Apache的新手,目前正在使用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扩展了PDSimpleFont
  • PDSimpleFont.glyphList
    正确地包含从Unicode代码点(U+2714)到PDF名称(“a20”)的映射,如异常文本所示(在
    PDSimpleFont
    的ZapfDingbat字形构造函数中设置)
  • 。。。但是
    PDType1Font
    的构造函数行110中设置为
    winansienceoding
    PDSimpleFont.encoding
    不包含名称
    a20
    -这些名称(编码)在
    winansienceoding
    类中静态设置-请参阅第36行的
    WIN\u ansienceoding\u表
    常量
  • 是否有人使用PDFbox显示了丁蝙蝠铭文?即使是较低版本?

    我怀疑这是一个bug(a20应该根据“ZapfDingbats设置和编码”转换为064,我找不到这是在哪里完成的),请在中打开一个问题。同时,如果您使用windows,这里有一个解决方法:

    而不是

    PDType1Font font = PDType1Font.ZAPF_DINGBATS;
    
    使用

    更新:现已解决
    这确实是一个bug,并解决了这个问题。它现在已在PDFBox 2.0.3版中解决。

    感谢您的建议。不幸的是,我的目标是平台独立性(因此Java、PDF和标准字体),开发/生产组合确实包括Linux。。。将查看JIRA是否有什么结果,同时可能尝试学习原始命令(使用库正是因为希望避免:-()@fr13d最有可能使用(已弃用)原始命令。如果您需要帮助,请在邮件列表或您打开的问题中提及,提及您需要的标志符号,我会帮助您(不是星期五,因为我会很忙)。
    PDFont font = PDType0Font.load(document, new File("c:/windows/fonts/arialuni.ttf"));