我正在使用iText 2.1.2生成PDF。我正在使用java.awt.Graphics2D
在PDF中绘制对象。我也使用java.awt.font
来设置字体。
我想将字体嵌入PDF中。是否可以将java.awt.font
嵌入PDF?
答案 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,您会注意到您可能会遇到一些问题。
.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 site和book中还有更多内容。
正如我之前所说,这可能适用于iText 2.1.2,但如果你为自己所做的事情感到自豪,并且如果你重视我们的客户,你将升级到更新版的iText。