使用PDFbox

时间:2016-03-30 15:38:48

标签: java pdfbox dingbats

我试图在我的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处发生的事情是:

  1. PDType1Font extends PDSimpleFont
  2. PDSimpleFont.glyphList正确包含从Unicode代码点(U + 2714)到PDF名称(“a20”)的映射,如异常文本中所示(在PDSimpleFont的构造函数中设置ZapfDingbat字形)。
  3. ...但在PDSimpleFont.encoding的构造函数行110中设置为WinAnsiEncoding的{​​{1}}不包含名称PDType1Font - 这些名称(编码) )在a20类中静态设置 - 请参阅第36行的WinAnsiEncoding常量。
  4. 有没有人使用PDFbox管理过显示Dingbat字形 - 即使版本较低?

1 个答案:

答案 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中已解决