参考:http://www.hihubs.com/article/279
这几天磨磨唧唧在整理html转pdf这一个功能,还好领导不急。让我慢慢整。流程基本已明确了,我们这边从协同那边同步数据,然后销售在后台生成链接发给客户,然后客户在H5(jSignature)好签名上传将签名保存成png文件,再将png文件压到pdf的指定位置上。
坑1:itextpdf不支持 css 的float,position,border-xxxx这些属性,如果使用了float:xxx之类的,生成的pdf直接白屏(没任何数据),我X,最后使用table 替换div...
坑2 : 由于需要将签名盖在指定位置,而由于内容不同,所以定的位置也不同,然后我就想使用js获取div的高度,然后将值写入属性传进来,我再将高度/a4高度,想算出页数,后来发现我还是太天真了...最后听常帅的,重新创建一页,然后内容就能固定了。
好了,上代码
public static void createPdf(String url,String outFileName) throws Exception {
Document document = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream(outFileName));
document.open();
document.addAuthor("蜗蜗游旅行网");
document.addTitle("蜗蜗游旅行网电子合同");
document.addCreator("蜗蜗游旅行网");
document.addHeader("wowoyoo.com", "蜗蜗游");
document.addKeywords("蜗蜗游,电子合同 ");
document.addSubject("蜗蜗游旅行网电子合同");
org.jsoup.nodes.Document _doc = getHtmlContent(url);
_doc =Jsoup.parse(_doc.select(".body-cls").html());
_doc.getElementsByTag("img").remove();
_doc.outputSettings().syntax(org.jsoup.nodes.Document.OutputSettings.Syntax.xml);
String sign_table_html = _doc.select(".sign-table").html();
_doc.select(".sign-table").remove();
String _html = _doc.html();
InputStream cssInput =new URL("http://t.wnew.tt/assets/sign.css").openConnection().getInputStream();
//HTML转PDF
XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,new ByteArrayInputStream(_html.getBytes()),cssInput,Charset.forName("UTF-8"), new AsianFontProvider());
//新建一个空白页
document.newPage();
XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,new ByteArrayInputStream(sign_table_html.getBytes()),Charset.forName("UTF-8"), new AsianFontProvider());
document.close();
}
//公司印章
Image _compnay_image = Image.getInstance(Content.STAMP_PATH);
Image _user_image = Image.getInstance(Content.getSignImageUrl(filename));
//这个是将图片盖在pdf上面,这个是公司印章
PdfAnnotation stp = PdfAnnotation.createStamp(stamper.getWriter(),_cell, "蜗蜗游旅行网", "wowoyoo.com");// 每一页加标签
PdfAppearance tp = PdfAppearance.createAppearance(stamper.getWriter(),_rect.getWidth(), _rect.getHeight());
_compnay_image.setAbsolutePosition(360, 650);// X:坐标,Y:右下角坐标,这里自己调位置
_compnay_image.scaleAbsolute(120,120);
tp.addImage(_compnay_image);
//会员签名
_user_image.setAbsolutePosition(120, 700);// X:坐标,Y:右下角坐标,这里自己调位置
_user_image.scaleAbsolute(120,120);
tp.addImage(_user_image);