使用 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
处发生的情况是:
- (
PDType1Font extends PDSimpleFont
)
PDSimpleFont.glyphList
正确包含从 Unicode 代码点 (U+2714) 到 PDF 名称 ("a20") 的映射,如异常文本(在 PDSimpleFont
中设置)所示ZapfDingbat 字形的 s 构造函数)。
- ...但是
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 中解决。
我正在尝试在我的 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 字形的 s 构造函数)。- ...但是
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 中解决。