使用IText

时间:2016-05-04 09:01:06

标签: java pdf fonts itext itextpdf

所以我有以下问题。我收到一个包含一组字体的PDF文件。这些字体未嵌入到文件中。这是一个简单的例子:

non embedded font

我想将这些字体嵌入PDF中,因此它们是自包含且始终可用的。但事情似乎并不那么简单。我正在使用IText进行PDF处理。

我已阅读并尝试了以下问题/答案:

但让我最接近的是以下例子:EmbedFontPostFacto.java(来自书中)。在提供Arial文件时,我能够嵌入Arial.ttf字体。

embedded font

但是,与其他示例一样,我需要字体的源文件才能嵌入它。就我而言,我没有源文件。但是我可能会把它们放在系统上。所以我想在系统上查询我的可用字体,看看它是否与给定的字体相对应。

喜欢的东西

GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
java.awt.Font[] fonts = e.getAllFonts();
for(java.awt.Font f : fonts){
    System.out.println(f.getFontName());
}

但我无法将给定的java.awt.Font转换为RandomAccessFilebyte[],以便嵌入字体文件本身。有没有另一种方法可以将字体嵌入PDF,而不需要字体的源文件本身?

1 个答案:

答案 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());
}