如何使用iText和Flying Saucer在HTML中创建PDF格式的字体?

Mic*_*las 13 html pdf itext flying-saucer apache-fop

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

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

<BODY style="font-family: Tahoma, Arial, sans-serif;font-size : 8pt;">
Run Code Online (Sandbox Code Playgroud)

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

  • 与htmlcleaner的FOP
  • iText与飞碟

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

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

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

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

Ada*_*dam 13

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

用户指南:

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

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

例如在你的print css中:

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

  • 那对我有用。使用 `@font-face { font-family: Roboto; src: url(file:///home/fonts/Roboto-Regular.ttf); 字体粗细:正常;字体样式:正常;-fs-pdf-font-embed:嵌入;-fs-pdf-font-encoding:Identity-H;}` 并通过例如`&lt;body style="font-family: Roboto;"&gt;` 使用它 (2认同)

Mar*_*ert 5

工作示例:

项目根目录下的文件:

  • 校准.ttf
  • 输入.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();       
Run Code Online (Sandbox Code Playgroud)

HTML:

<style type="text/css">
    body {
        font-family: Calibri, sans-serif;
    }
</style>
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*las 3

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

  • 嘿,我有同样的问题,我尝试了这个代码 `renderer.getFontResolver().addFont("c:/simsun.ttf", "UTF-8",BaseFont.EMBEDDED);//我也尝试了 arialuni.ttf ` 但这不起作用 (2认同)