使用itextpdf 將 html 轉成 pdf遇到的坑
阿新 • • 發佈:2019-02-15
這幾天磨磨唧唧在整理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);