如何在使用 iText 和 Flying Saucer 从 HTML 创建的 PDF 中嵌入字体?

新手上路,请多包涵

我在将波兰语字体嵌入从 HTML 转换的 PDF 时遇到问题。

我的 HTML 代码在正文中有样式:

 <BODY style="font-family: Tahoma, Arial, sans-serif;font-size : 8pt;">

我尝试了两种将此类 HTML 转换为 PDF 的方法:

  • FOP 与 htmlcleaner
  • 带飞碟的 iText

对于 FOP,我可以将所有使用的字体添加到其配置文件中,然后创建的 PDF 嵌入了这些字体(如果在 HTML 中使用了字体)。在生成的 PDF 中,我在 Identity-H 编码中使用了 Tahoma 字体。看起来不错——所有波兰语字母都按预期显示。

然后我尝试使用 iText 进行此类转换:似乎更简单,因为我不需要为每个 HTML 创建转换。不幸的是,我不知道如何将使用过的字体嵌入生成的 PDF 中。我发现的大多数示例都是从头开始创建 PDF,但我不知道如何将这些方法应用于 Flying Saucer ITextRenderer 或转换中使用的其他对象。

我当前的代码试图通过获取 ITextFontResolver 并添加字体 fs.addFont(path, true);PDFCreationListener.preOpen() 中添加字体。但是我创建的所有 .pdf 文件都没有我想要的字体。

第二个问题是结果 PDF 没有波兰语字母。 Flying Saucer 或 iText 中有问题吗? Acrobat 显示创建的 PDF 文档使用带有 Ansi 编码的 Helvetica 和 ArialMT 作为字体。我觉得这个Ansi编码不好。如何设置波兰语编码 (Identity-H)?

原文由 Michał Niklas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

我的错误是在 FontResolver.addFont() 中使用了 PDFCreationListener.preOpen() 。我在 renderer.layout(); 之前移动了它,现在可以使用了!

原文由 Michał Niklas 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以尝试 -fs-pdf-font-embed 和 -fs-pdf-font-encoding css 规则。

用户指南

-fs-pdf-font-embed: 与字体规则内的嵌入值一起使用,让飞碟在 PDF 文档中嵌入字体文件,避免调用 FontResolver 类的 addFont() 方法

-fs-pdf-font-encoding: 在 font-face 规则中使用以指定要嵌入 PDF 中的自定义字体的编码;将编码的名称作为值。

例如在你的打印 css 中:

 @font-face {
    font-family: DejaVu Serif;
    src: url(fonts/DejaVuSerif.ttf);
    -fs-pdf-font-embed: embed;
    -fs-pdf-font-encoding: Identity-H;
}

原文由 Adam 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题