1. 程式人生 > >使用itextpdf 將 html 轉成 pdf遇到的坑

使用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);