使用 PDFbox 从 ZapfDingbats 绘制字形

Drawing glyph from ZapfDingbats using PDFbox

我正在尝试在我的 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 字形的 s 构造函数)。
  3. ...但是 PDSimpleFont.encoding,在 PDType1Font 的构造函数第 110 行中设置为 WinAnsiEncoding,不包含名称 a20 - 这些名称(编码)在 WinAnsiEncoding class 中静态设置 - 请参阅第 36 行的 WIN_ANSI_ENCODING_TABLE 常量。

有没有人设法使用 PDFbox 显示 Dingbat 字形 - 即使是在较低版本中?

我怀疑这是一个错误(根据“ZapfDingbats Set and Encoding”,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 中解决