如何将java.awt.font嵌入到PDF中

时间:2014-04-29 13:31:45

标签: fonts embed itext

我正在使用iText 2.1.2生成PDF。我正在使用java.awt.Graphics2D在PDF中绘制对象。我也使用java.awt.font来设置字体。

我想将字体嵌入PDF中。是否可以将java.awt.font嵌入PDF?

1 个答案:

答案 0 :(得分:2)

Alexis在评论中写道,你真的不应该再使用iText 2.1.2了。适用于更新版iText的解决方案可能有效,但这并不能解决与旧的iText版本相关的所有问题。

话虽如此,您可以在最近的iText版本中解决此问题,但使用FontMapper

假设dir是您存储要使用的字体(.ttf - 文件,.otf - 文件,...)的字体程序的目录。在这种情况下,您可以像这样使用DefaultFontMapper

DefaultFontMapper mapper = new DefaultFontMapper();
mapper.insertDirectory(dir);
Graphics2D g2 = new PdfGraphics2D(canvas, 600, 60, mapper);

如果您阅读chapter 14 of my book,您会注意到您可能会遇到一些问题。

  • 字体名称需要匹配,
  • 并非每个字体程序都会自动嵌入(只有Type1字体,您有.afm以及.pfb文件。)

您可以通过查看一些示例来解决这些问题。

例如:这会将名称MS Gothic(在创建Java字体时使用)映射到相应的字体程序(在本例中为TrueType集合中的特定字体):

DefaultFontMapper mapper = new DefaultFontMapper();
BaseFontParameters parameters = new BaseFontParameters("c:/windows/fonts/msgothic.ttc,1");
parameters.encoding = BaseFont.IDENTITY_H;
mapper.putName("MS PGothic", parameters );

由于我们使用IDENTITY_H作为编码,因此字符将以Unicode格式存储,并且将嵌入字体的子集。

您还可以创建自己的FontMapper实施,例如:

FontMapper arialuni = new FontMapper() {
    public BaseFont awtToPdf(Font font) {
        try {
            return BaseFont.createFont(
                    "c:/windows/fonts/arialuni.ttf",
                    BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public Font pdfToAwt(BaseFont font, int size) {
        return null;
    }
};
Graphics2D g2 = new PdfGraphics2D(canvas, 300, 150, arialuni);

现在使用哪个java.awt.Font并不重要:所有字体都将映射到MS Arial Unicode,字体将被嵌入(BaseFont.EMBEDDED)。

这些只是一些例子。 official web sitebook中还有更多内容。

正如我之前所说,这可能适用于iText 2.1.2,但如果你为自己所做的事情感到自豪,并且如果你重视我们的客户,你将升级到更新版的iText。