PDFBox提供了嵌入各种字体的机制。例如,它提供PDTrueTypeFont.loadTTF(...)
,它可以接受TrueType(* .ttf)文件。
TrueType集合格式(* .ttc)支持每个文件的多种字体,采用TrueType格式的扩展名。
尝试使用PDTrueTypeFont.loadTTF()
加载* .ttc文件会导致抛出IOException。
如何使用PDFBox将* .ttc文件中的一个或所有字体嵌入到PDF文档中?
答案 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));
}
Font
和FontFactory
位于com.google.typography.sfntly
Java代码不能保证100%正确;最近一直在Clojure工作....