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

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

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

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

最佳答案

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

就目前而言(和AFAIK),PDFBox本身并不支持此功能;我使用Google的“ sfntly” 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));
}


FontFontFactorycom.google.typography.sfntly

Java代码不能保证100%正确;最近在Clojure工作了很多...

10-08 01:18