使用PDFBox嵌入* .ttc字体

时间:2013-11-20 22:31:00

标签: java pdfbox true-type-fonts

PDFBox提供了嵌入各种字体的机制。例如,它提供PDTrueTypeFont.loadTTF(...),它可以接受TrueType(* .ttf)文件。

TrueType集合格式(* .ttc)支持每个文件的多种字体,采用TrueType格式的扩展名。

尝试使用PDTrueTypeFont.loadTTF()加载* .ttc文件会导致抛出IOException。

如何使用PDFBox将* .ttc文件中的一个或所有字体嵌入到PDF文档中?

1 个答案:

答案 0 :(得分:2)

PDF规范不允许将TrueType集合作为嵌入字体。您需要从* .ttc中提取单个TTF格式的流并嵌入。

现在(和AFAIK)PDFBox本身不支持这个;我使用谷歌''package.

快速而肮脏的解决方案:

FontFactory factory = FontFactory.getInstance();
Font[] fonts = factory.loadFonts( ... ); // pulls every TTF out of TTC
ArrayList<PDTrueTypeFont> pdf_fonts = new ArrayList<PDTrueTypeFont>();
for( Font f : fonts ){
   // sfntly writes each font to a TTF stream
   ByteArrayOutputStream out = ByteArrayOutputStream();
   factory.serializeFont(f, out);

   // PDFBox reads the stream and embeds the font
   ByteArrayInputStream ttf_font_stream = ByteArrayInputStream(out.toByteArray());
   pdf_fonts.add(PDTrueTypeFont.loadTTF(document, ttf_font_stream));
}

FontFontFactory位于com.google.typography.sfntly

Java代码不能保证100%正确;最近一直在Clojure工作....