itextxmlworker转换html⽣成pdf⽂件转载:blog.sina/s/blog_71d09f5f0101bi8g.html
⼯作需要,把⼀些表格以pdf格式输出以供打印。查到itext是java的开源⽣成pdf的⼯具包,看了使
⽤后感觉好复杂,竟然要把表格⽤itext语法重新绘制到pdf⽂档中。再查直接转换html到pdf的⼯
具,发现有flying-saucer,看了下感觉更新不是很及时,⼜看了Ireport,感觉是从数据库导出多项
数据成报表的,和我要转换html table的思路不⼀致。后来查到itext有个独⽴的xmlworker就做这件
事情,想着itext分属出来的应该和itext的集成⽐较好,就选了这个。
itextpdf-5.3.5,xmlworker5.4.0,以及提供亚洲字体的extrajars-2.2中的itext-asian.jar 查了些资料,参考:
他的做法是定义⾃⼰的parser, MyXMLParser p=new MyXMLParser(worker);并且为了⽀持中⽂,
直接修改l.xml.pipeline.html.HtmlPipeline的源代码,感觉很黄很暴⼒。⼜去英⽂⽹站⼀通检
索,终于得到了⼀些启发,没有留存,就不表出处了。其中提到关键的⼀点说以前可以⽤XMLWorkerFontProvider来提供相应的字体,按照这个思路来说,也是可以提供中⽂字体进来的。 信息采集研究了⼀下,选定l.xml.XMLWorkerHelper来处理html流,传⼊⾃定义的 fontProvider来提供中⽂字体。
⽰例:
class myFontProvider extends XMLWorkerFontProvider {
8510w
@Override
public Font getFont(final String fontname, final String encoding,
final boolean embedded, final float size, final int style,
final BaseColor color) {
BaseFont bf = null;
try {
bf = ateFont("STSong-Light", "UniGB-UCS2-H",
BaseFont.NOT_EMBEDDED);hanhan
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
医用灯泡
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Font font = new Font(bf, size, style, color);
font.setColor(color);
return font;
}
}
处理代码:
Document document = new Document(PageSize.A4, 30, 30, 30, 30);
document.setMargins(30, 30, 30, 30);2011国际大学英辩论会
PdfWriter pdfwriter;
pdfwriter = Instance(document,
document.open();北京龙源冷却技术有限公司
XMLWorkerHelper wh = Instance();
InputStream cssInput = null;
wh.parseXHtml(pdfwriter, document, input, cssInput,
new myFontProvider());
document.close();
问题解决了,不需要修改源代码,重载getFont来提供中⽂字体,改的还是⽐较粗暴,只提供了宋体⼀种字体,感兴趣的可以根据fontname提供多种字体,时间所限就没再尝试了。html流要写的标准,有不合标准的会报错,具体看itext说明⽀持的xml标准即可。如果html流不是⾃⼰⽣成的,可以参考别⼈提到的⼀些转换⼯具,我看到有jtidy类似的⼯具,没研究过不做评述。