使用itextpdf 将 html 转成 pdf遇到的坑

 这几天磨磨唧唧在整理html转pdf这一个功能,还好领导不急。让我慢慢整。流程基本已明确了,我们这边从协同那边同步数据,然后销售在后台生成链接发给客户,然后客户在H5(jSignature)好签名上传将签名保存成png文件,再将png文件压到pdf的指定位置上。

     坑1:itextpdf不支持 css 的float,position,border-xxxx这些属性,如果使用了float:xxx之类的,生成的pdf直接白屏(没任何数据),我X,最后使用table 替换div...

     坑2 : 由于需要将签名盖在指定位置,而由于内容不同,所以定的位置也不同,然后我就想使用js获取div的高度,然后将值写入属性传进来,我再将高度/a4高度,想算出页数,后来发现我还是太天真了...最后听常帅的,重新创建一页,然后内容就能固定了。

好了,上代码

    1,HTML 转 PDF ,后面创建一个新页,将需要盖章的内容写入进去。

    

   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();
		
	}

   2,图片就可以在指定位置盖上了。

    

		//公司印章
		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);




  3,上图

   


收工.....