需求背景:
公司要求通过表单数据渲染模板后生成PDF。
坑:
1.很多直接字符串写入pdf的包对于html的格式太严谨,没结束标签一言不合就拦掉,出现只渲染一半的情况;
2.不大支持html5的样式,如:h2 .title{},.a .b{},li.a{}这些情况不能生效;
3.网上很多都碰到中文乱码,当然我没搞到那个地步所以没碰到;
4.还有其它的坑就不细说了...
其实字符串转pdf我是没弄成功的,不过我用了个蠢萌的方法,先将html字符串转成图片,再将图片写入pdf,虽然上面第2坑还是依旧但是至少一些像padding等不会失真,页面的整体框架样式基本不会变,不过如果页面有插入img就不好搞了,反正在这里我就没搞定,img要是不多直接像打水印打上去得了。
1.html转图片
String html = "<html></html>";
String imgPath = "F://test/01.png";
HtmlImageGenerator imageGenerator = new HtmlImageGenerator();
imageGenerator.loadHtml(html);
imageGenerator.getBufferedImage();
imageGenerator.saveAsImage(imgPath);
2.图片转pdf
String pdfPath = "F://test/01.pdf";
File file=new File(imgPath);
if(file.exists()){
Document document = new Document();
FileOutputStream fos = null;
try {
fos = new FileOutputStream(pdfPath);
PdfWriter.getInstance(document, fos);
// 添加PDF文档的某些信息,比如作者,主题等等
document.addAuthor("XXX平台");
document.addSubject("XXX方案书");
// 设置文档的大小
document.setPageSize(PageSize.A4);
// 打开文档
document.open();
// 写入一段文字(页眉)
// document.add(new Paragraph("百度——百度一下,你就知道 www.baidu.com"));
// 读取一个图片
Image image = Image.getInstance(imgPath);
float imageHeight=image.getScaledHeight();
float imageWidth=image.getScaledWidth();
//统一按照宽度压缩
int percent=getPercent(imageHeight, imageWidth);
//按百分比显示图片的比例
image.scalePercent(percent);//表示是原来图像的比例
image.setAlignment(Image.MIDDLE);
// 插入一个图片
document.add(image);
Image img = Image.getInstance("http://www.baidu.com/images/logo.png");
//logo图片大小设置
img.scaleAbsolute(img.getScaledWidth()/3, img.getScaledHeight()/3);
//logo在整张pdf中的宽高设置
img.setAbsolutePosition(image.getScaledWidth()/2,image.getScaledHeight());
//img.setAbsolutePosition(0, 0);
document.add(img);
} catch (DocumentException de) {
System.out.println(de.getMessage());
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
document.close();
fos.flush();
fos.close();
return true;
}
大致就是以上代码,如果有写得不对或low的地方多多海涵,默默自己忍着不用告诉我。
不过图片转pdf还是有很多缺点,比如你的内容好几页那这些代码也不好使,目前只支持单页;又比如用页面打开pdf看着好难看感觉五官都扭曲了,不过如果用阅读器打开相对会好点,这些估计得从页面样式下手。这边只是给个大致思路及实现,如果有需要更精细的操作建议看下包下面的源代码或者文档,还有挺多方法跟属性,说不定其中的某个方法就是你刚需的呢。