Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用PDFBox嵌入*.ttc字体_Java_Pdfbox_Truetype - Fatal编程技术网

Java 使用PDFBox嵌入*.ttc字体

Java 使用PDFBox嵌入*.ttc字体,java,pdfbox,truetype,Java,Pdfbox,Truetype,PDFBox提供了嵌入各种字体的机制。例如,它提供了PDTrueTypeFont.loadTTF(…),可以接受TrueType(*.ttf)文件 TrueType集合格式(*.ttc)在TrueType格式的扩展名中支持每个文件的多个字体 尝试加载带有PDTrueTypeFont.loadTTF()的*.ttc文件会引发IOException 如何使用PDFBox将*.ttc文件中的一种或所有字体嵌入到PDF文档中?PDF规范不允许TrueType集合作为嵌入字体。您需要从*.ttc中提取一个

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

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

尝试加载带有
PDTrueTypeFont.loadTTF()
的*.ttc文件会引发IOException


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

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

目前(和AFAIK)PDFBox本身并不支持这一点;我用了谷歌的“sfly”

快速而肮脏的解决方案:

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));
}
FontFactory=FontFactory.getInstance();
Font[]fonts=factory.loadFonts(…);//将每个TTF从TTC中拉出
ArrayList pdf_fonts=新建ArrayList();
用于(字体f:字体){
//sfsnly将每个字体写入TTF流
ByteArrayOutputStream out=ByteArrayOutputStream();
工厂。序列化字体(f,out);
//PDFBox读取流并嵌入字体
ByteArrayInputStream ttf_font_stream=ByteArrayInputStream(out.toByteArray());
添加(PDTrueTypeFont.loadTTF(文档,ttf字体流));
}
Font
FontFactory
位于
com.google.typography.sfntly


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

谢谢!看起来不错。我可以用SFC从*.ttc文件中获取字体名称吗?您是否知道,如果要获取sfntly字体的名称,需要解析字体的其余部分?您可以使用sfntly获取名称;但这并不完全“简单”。您需要
getTable(Tag.name)
来获取
NameTable
的实例。您可以使用
.getNameEntry
从那里访问名称,但必须传入适当的常量。这将使您能够访问字体的大量“名称”。通过迭代
NameTable
并使用
FontFamilyName
PreferredFamily
作为其
nameId
提取第一个条目,您可能是最安全的。。。。不幸的是,是的;当您构建sfnt
Font
s时,它会解析整个sfnt包装,但是如果需要,您可以使用
FontFactory.loadFontsForBuilding
(它提供了
Font.Builder
对象的列表;然后您可以将这些对象拆分为只解析
name
表。然后调用
.build()
在builder对象上生成一个
Font
对象,您可以随意查看。对于名称,我在SFLint.java中找到了示例代码,它使用常量
NameId.FontFamilyName
NameId.FullFontName
。我还将查看
PreferredFamily
。感谢您对
FontFactory.load的建议FontsForBuilding()
。你的优秀答案值得更多的投票。至少在Mac上,*.ttc似乎失败了。1PDTrueTypeFont.loadTTF()1在一些设置变量的代码之后抛出一个NPE,如果它找到一个平台ID可接受的表。platform_WINDOWS`。看起来这可能是一个错误;我将报告它。