15

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

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

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

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

  • 带有 htmlcleaner 的 FOP
  • 带有飞碟的 iText

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

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

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

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

4

3 回答 3

18

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

用户指南

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

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

例如在您的打印 css 中:

@font-face {
    font-family: DejaVu Serif;
    src: url(fonts/DejaVuSerif.ttf);
    -fs-pdf-font-embed: embed;
    -fs-pdf-font-encoding: Identity-H;
}
于 2011-10-05T14:07:12.907 回答
4

工作示例:

项目根目录下的文件:

  • 校准文件
  • 输入.html

代码:

File inputFile = new File("input.html");
File outputFile = new File("example.pdf");

ITextRenderer renderer = new ITextRenderer();

String url = inputFile.toURI().toURL().toString();
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);

renderer.setDocument(url);
renderer.getFontResolver().addFont("Calibri.ttf", BaseFont.IDENTITY_H, true);
renderer.layout();
renderer.createPDF(fileOutputStream);

fileOutputStream.close();       

HTML:

<style type="text/css">
    body {
        font-family: Calibri, sans-serif;
    }
</style>

令人惊讶@font-face的是不需要css

于 2018-10-17T10:44:48.010 回答
3

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

于 2011-10-17T07:01:41.020 回答