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的方法:
对于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)
工作示例:
项目根目录下的文件:
代码:
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
我的错误是使用FontResolver.addFont()在PDFCreationListener.preOpen(). 我之前移动过它renderer.layout();,现在它可以工作了!