Fonts 如何将java.awt.font嵌入PDF

Fonts 如何将java.awt.font嵌入PDF,fonts,embed,itext,Fonts,Embed,Itext,我正在使用iText2.1.2生成PDF。我正在使用java.awt.Graphics2D在PDF中绘制对象。我还使用java.awt.font设置字体 我想将字体嵌入到PDF中。是否可以将java.awt.font嵌入PDF?正如Alexis在评论中所说的,您真的不应该再使用iText 2.1.2了。适用于较新版本的iText的解决方案可能可行,但这并不能解决与旧版本iText相关的所有问题 话虽如此,您可以在最新的iText版本中解决这个问题,但使用的是 假设dir是一个目录,其中存储了要使

我正在使用iText2.1.2生成PDF。我正在使用
java.awt.Graphics2D
在PDF中绘制对象。我还使用
java.awt.font
设置字体


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

正如Alexis在评论中所说的,您真的不应该再使用iText 2.1.2了。适用于较新版本的iText的解决方案可能可行,但这并不能解决与旧版本iText相关的所有问题

话虽如此,您可以在最新的iText版本中解决这个问题,但使用的是

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

DefaultFontMapper mapper = new DefaultFontMapper();
mapper.insertDirectory(dir);
Graphics2D g2 = new PdfGraphics2D(canvas, 600, 60, mapper);
如果你阅读,你会注意到你会遇到一些问题

  • 字体名称需要匹配
  • 并不是每个字体程序都会自动嵌入(只有您拥有
    .afm
    以及
    .pfb
    文件的Type1字体)
您可以通过查看一些示例来解决这些问题

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

由于我们使用了
IDENTITY\u 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

这些只是一些例子。网上和网上还有更多


正如我之前所说,这可能在iText 2.1.2中起作用,但如果您对自己的工作感到自豪,并且重视我们的客户,您将升级到更新版本的iText。

您尝试了什么?例如:Helvetica从不嵌入,CJK字体也不嵌入(原因很明显,您可能不太清楚)。我们使用itextpdf-5.4.0.jar创建了一个测试程序。但是字体没有嵌入。我们使用AttributedString和TextLayout来绘制文本。我们使用AttributeString设置文本的RTL<R。graphics2D.setFont(graphicsFont);AttributedString attStr=新的AttributedString(“Hello World”);attStr.addAttribute(texttribute.FONT,graphicsFont.getFont(“Verdana”));text布局text布局=新的文本布局(attStr.getIterator(),graphics2D.getFontRenderContext());textLayout.draw(图形2D、5、24);你是否遵循了我书第14章所述的建议?您将看到,将字体和
图形2d
结合起来并不像您想象的那么简单。第14章解释了一些缺陷。我们尝试使用iText5.4.0和上面Bruno建议的代码&graphics2D.drawString。现在字体已嵌入,但阿拉伯文本显示不正确。如果我们使用TextLayout来绘制,阿拉伯文本会正确显示,但字体不会嵌入。谢谢你的建议。你所说的是真的,同时又不是真的。你说字体没有嵌入,但是。。。如果使用
TextLayout
方法,则文件中没有字体。事实上:您的文件中没有文本!使用路径构造和路径绘制操作符绘制所有图示符。这意味着您可以在任何设备上查看PDF,即使它没有任何阿拉伯语字体。这也意味着没有人可以复制/粘贴或提取文本,而且文件大小可能很大。这在我的书里都解释过了,不是吗?
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);