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

时间:2011-09-23 07:03:23

标签: html pdf itext apache-fop flying-saucer

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

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

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

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

  • 使用htmlcleaner进行FOP
  • iText with flying-saucer

对于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)?

3 个答案:

答案 0 :(得分:12)

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

来自User's Guide

  

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

     

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

例如在你的print css中:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

工作示例:

项目根目录中的文件:

  • Calibri.ttf
  • input.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