所以我有以下问题。我收到一个包含一组字体的PDF
文件。这些字体未嵌入到文件中。这是一个简单的例子:
我想将这些字体嵌入PDF
中,因此它们是自包含且始终可用的。但事情似乎并不那么简单。我正在使用IText
进行PDF
处理。
我已阅读并尝试了以下问题/答案:
16.1.4 Replacing a font
iText in Action - 2nd Edition
章
但让我最接近的是以下例子:EmbedFontPostFacto.java
(来自书中)。在提供Arial
文件时,我能够嵌入Arial.ttf
字体。
但是,与其他示例一样,我需要字体的源文件才能嵌入它。就我而言,我没有源文件。但是我可能会把它们放在系统上。所以我想在系统上查询我的可用字体,看看它是否与给定的字体相对应。
喜欢的东西
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
java.awt.Font[] fonts = e.getAllFonts();
for(java.awt.Font f : fonts){
System.out.println(f.getFontName());
}
但我无法将给定的java.awt.Font
转换为RandomAccessFile
或byte[]
,以便嵌入字体文件本身。有没有另一种方法可以将字体嵌入PDF
,而不需要字体的源文件本身?
答案 0 :(得分:1)
对于Windows C:\Windows\Fonts
或其他包含所有字体文件,并且在资源管理器中还显示字体名称。所以手动搜索是可行的。
在java中,您有GraphicsEnvironment.getAvailableFontFamilyNames()
和Font.getFamilyName()
来检查PDF中的名称,例如" Arial MT。"
然而,Font中缺少文件的getter。
因此列出字体目录的所有文件,并将每个文件连续加载为Font。
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font font = Font.createFont(Font.TRUETYPE_FONT, ttfFile);
ge.registerFont(font); // If you want to load the font.
if (pdfFontName.startsWith(font.getFamilyName()) {
System.out.printf("%s - %s / %s%n", ttfFile.getName(), font.getFamilyName(),
font.getName());
}