为啥我创建 PDF 文档时没有应用我的字体?

Posted

技术标签:

【中文标题】为啥我创建 PDF 文档时没有应用我的字体?【英文标题】:Why is my font not applied when I create a PDF document?为什么我创建 PDF 文档时没有应用我的字体? 【发布时间】:2015-12-13 14:19:57 【问题描述】:

我正在使用 iText 生成 PDF 文档。当我尝试包含“Agenda Tabular Light”字体时,iText 会忽略我选择的字体。 我确认没有使用 Adob​​e Reader 的 File > Properties > Fonts 设置字体。 PDF显示使用了Helvetica,但我没有选择Helvetica。 颜色可见,但字体不可见。

我的代码如下所示:

public static final Font FONT_HEADER = FontFactory.getFont(AGENDA_TABULAR_LIGHT, 18, Font.NORMAL, TITLE_COLOR);

我什至尝试了一个示例程序。

// step 1
    Document document = new Document();
    // step 2
    PdfWriter.getInstance(document, new FileOutputStream(filename));
    // step 3
    document.open();
    // step 4:
    Font font = FontFactory.getFont("Agenda Tabular Light");

    System.out.println(font.toString());

    document.add(new Phrase("Agenda Tabular Light J j", font));
    Font fontbold = FontFactory.getFont("Times-Roman", 12, Font.BOLD);
    document.add(new Phrase("Times-Roman, Bold", fontbold));
    document.add(Chunk.NEWLINE);

    document.close();

它像 Times-Roman 一样显示,并使用不同的字体来表示议程。 但是每当我在 Adob​​e Reader 的属性上看到字体选项卡时,它就会显示 Helvetica。

【问题讨论】:

很难相信您的企业需要您使用过时的、不受支持的 iText 版本(从 2009 年 7 月开始)。请升级到较新的版本以避免 iText 2.1.7 中存在的法律和技术问题,我们将重新审视您的问题。 它正在生产中,将其升级到最新版本不是我的决定。但我需要设置字体,一切都设置好了,比如大小、颜色,但不是特别是字体。有没有可以提供的解决方案? 是的,正如文档明确指出的那样,如果您没有先使用该别名注册字体,则不能使用诸如 "Agenda Tabular Light" 之类的字体别名。谁决定升级过程?请告知我们,以免客户使用有问题的 iText 版本。 谢谢布鲁诺,那我先注册一下。关于升级,我应该先和我的经理谈谈。之后我可以告诉你。 【参考方案1】:

如 cmets 中所述,这通常不起作用:

Font font = FontFactory.getFont("garamond bold");

默认情况下,FontFactory 只知道 标准 Type 1 字体,而 "garamond bold" 不是这些字体之一,因此将使用 Helvetica 代替(Helvetica 是iText)。

您可以通过注册“教”FontFactory 在哪里找到其他字体。

你可以试试:

FontFactory.registerDirectories();

但这是一项非常昂贵的操作,因为您要求 iText 在您的操作系统中搜索不同字体目录中的字体文件(例如 C:/Windows/Fonts)。这可能需要几秒钟,您最终会得到比您需要的字体多得多的字体(而且您需要的字体可能无论如何都不会被注册)。

最好的方法是像这样注册你需要的字体:

FontFactory.register("c:/windows/fonts/garabd.ttf", "garamond bold");

我们告诉 iText 在哪里可以找到 ttf 文件 ("c:/windows/fonts/garabd.ttf"),并为该字体定义一个别名 ("garamond bold")。现在字体名称已经注册好了,我们可以开始使用它了:

Font myBoldFont = FontFactory.getFont("garamond bold");

【讨论】:

谢谢,它成功了,我也得到了 PDF 的属性。

以上是关于为啥我创建 PDF 文档时没有应用我的字体?的主要内容,如果未能解决你的问题,请参考以下文章

为啥WORD转换PDF时字体会丢失?

Rails 4:为啥在生产中没有加载字体?

用adobe acrobat 8 将pdf文件转换为Word时为啥会出现乱码

如何在现有 PDF 中嵌入字体?

Itext 7使用pdf中的材料ui图标

可以在没有嵌入字体的情况下编辑PDF吗?