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));
}
Font
和FontFactory
在com.google.typography.sfntly
中Java代码不能保证100%正确;最近在Clojure工作了很多...