我将波兰字体嵌入到从HTML转换的PDF中时遇到问题。
我的HTML代码在正文中有样式:
<BODY style="font-family: Tahoma, Arial, sans-serif;font-size : 8pt;">
我尝试了两种将这种HTML转换为PDF的方法:
对于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)?
答案 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)
工作示例:
项目根目录中的文件:
代码:
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