最近研究了使用iText ,XMLWorker转HTML为PDF,遇到了两个问题,一是中文问题,二是图片。
一.中文问题
1.问题描述:html中的中文转成pdf后是空白的
2.解决方案:自定义字体类 MyFontsProvider 并继承 XMLWorkerFontProvider,在该类中定义字体。
代码如下:
public static class MyFontsProvider extends XMLWorkerFontProvider {
public MyFontsProvider() {
super(null, null);
}
@Override
public Font getFont(final String fontname, String encoding, float size, final int style) {
BaseFont bfChinese =null;
try {
bfChinese=BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
return FontChinese;
}
}
二.图片
1.问题描述:htm的图片转为pdf后显示不出来
2.解决方案:设置html中图片的路径
代码如下:
public static ElementList parseHtml(final String html,final String imgPath){
CSSResolver cssResolver = new StyleAttrCSSResolver();
MyFontsProvider fontProvider = new MyFontsProvider();//中文字体设置
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
//设置html中图片的路径
htmlContext.setImageProvider(new AbstractImageProvider() {
public String getImageRootPath() {
return imgPath;
}
});
htmlContext.autoBookmark(false);
// Pipelines
ElementList elements = new ElementList();
ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);
CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
// XML Worker
XMLWorker worker = new XMLWorker(cssPipeline, true);
XMLParser p = new XMLParser(worker);
try {
p.parse(new ByteArrayInputStream(html.getBytes()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return elements;
}