日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

生成 PDF 全攻略【1】初体验

發(fā)布時間:2025/4/9 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生成 PDF 全攻略【1】初体验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ?經(jīng)歷過多少踩坑,翻看過多少類似博客,下載過多少版本的Jar,才能摸索出正確的代碼書寫方式,才能實(shí)現(xiàn)項(xiàng)目經(jīng)理需求分析書中的功能點(diǎn)。

? ? ?本文借一次 JavaEE 生成PDF的顛簸的實(shí)現(xiàn)過程,描述中小公司程序員的坎坷成長之路。

? ? ?俺上面只所以將成熟大公司排除在外的原因是,大公司一般都有成熟的產(chǎn)品線和技術(shù)積淀。

? ? ?至少會有完善的建構(gòu)師團(tuán)隊(duì),有像掃地神僧那樣的牛人隱士......

? ? ?公司中初級程序員遇到問題,能找到以前實(shí)現(xiàn)過的類似功能的代碼作為參照,也能咨詢技術(shù)經(jīng)理。

? ? ?小公司是沒有這種福分的,就像昨天早晨"生成PDF"需求到,工期一天,明日要給客戶看。

? ? ?第一反應(yīng)是找谷歌,關(guān)鍵字 "Java生成PDF",博客不是一般的多,下面簡述幾種實(shí)現(xiàn)方式和實(shí)現(xiàn)過程中遇到的問題。

? ? ?(目錄已列在上面,通過搜索引擎進(jìn)來的小伙伴,看看上面列表中是否有能解決你問題的,有點(diǎn)到相應(yīng)的小節(jié),沒有就關(guān)閉看下一條搜索記錄吧....)

1.IText 生成復(fù)雜PDF

? ? 谷歌中占比例最大的Java 生成PDF實(shí)現(xiàn)類庫,也是許多技術(shù)博客中涉及到技術(shù),官網(wǎng):http://itextpdf.com/

? ? 開源中國中的介紹:http://www.oschina.net/p/itext,好嘞,既然都推薦那就采用這類庫看看。

? ? 下載 Jar 也是琳瑯滿目,讓你挑花眼,從 2.1--5.5 應(yīng)有盡有,有些論壇下載東西還需要注冊o(︶︿︶)o 唉。

? ? 這里采用的是最新的版本 5.5,仔細(xì)閱讀下別人的技術(shù)博客或者是官方文檔,編碼起來確實(shí)不是很費(fèi)勁。筆者將業(yè)務(wù)抽象實(shí)現(xiàn)的類如下:

public class createSimplePDF {private Font FontChinese;public void simplePDF() {try {BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);FontChinese = new Font(bfChinese, 12, Font.NORMAL);Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("F:\\Garbage\\Hello simplePDF.pdf"));document.open();PdfPTable table = new PdfPTable(4);table.addCell(getCell("姓名", 1, 1));table.addCell(getCell("", 1, 1));table.addCell(getCell("編號", 1, 1));table.addCell(getCell("", 1, 1));table.addCell(getCell("部門", 1, 1));table.addCell(getCell("", 1, 1));table.addCell(getCell("崗位名稱", 1, 1));table.addCell(getCell("", 1, 1));table.addCell(getCell("到職日期", 1, 1));table.addCell(getCell("", 1, 1));table.addCell(getCell("預(yù)定離職日期", 1, 1));table.addCell(getCell("", 1, 1));table.addCell(getCell("事由", 1, 3));table.addCell(getCell("", 3, 3));table.addCell(getCell("部門意見", 1, 3));table.addCell(getCell("", 3, 3));document.add(table);document.close();} catch (Exception e) {e.printStackTrace();}}private PdfPCell getCell(String cellValue, int colspan, int rowSpan) {PdfPCell cell = new PdfPCell();try {cell = new PdfPCell(new Phrase(cellValue, FontChinese));cell.setRowspan(rowSpan);cell.setColspan(colspan);cell.setHorizontalAlignment(Element.ALIGN_CENTER);} catch (Exception e) {e.printStackTrace();}return cell;} }

2.IText添加對中文的支持

? ?愉快的將代碼編寫完成,生成后中文不見了,注意是不見了,不是亂碼。

? ?仔細(xì)觀察報(bào)錯,發(fā)現(xiàn)IText需要添加另外itext-asian.jar去支持中文,那就添加吧。

? ?因?yàn)樽约篒Text使用的是最新的5.5版本,導(dǎo)致其他低版本的?itext-asian.jar 無法支持(具體原因是5.0以上的itext包名發(fā)生了變化),拋出的錯誤如下:

? ?Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized

? ?最終在一篇博客中尋獲解決方法,嘗試后奏效,就是上述代碼中:

BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);FontChinese = new Font(bfChinese, 12, Font.NORMAL);

? 筆者這里將最新的IText.jar 和 配套的中文支持??itext-asian.jar,放置百度云盤,節(jié)省其他同學(xué)找 Jar 時間。

? 云盤地址:http://pan.baidu.com/s/1bqs4km? 提取密碼: 99eg

? 最終實(shí)現(xiàn)的截圖如下:

? 其實(shí)項(xiàng)目中最終要實(shí)現(xiàn)的表格的樣子比這個復(fù)雜的多,80%花費(fèi)時間主要是在調(diào)整樣式,編譯輸出--->看樣式,到這里其實(shí)需求已經(jīng)能夠?qū)崿F(xiàn)了。

? 筆者也是用這種方式實(shí)現(xiàn)的,畢竟是給客戶演示的。

? 這里要感謝的是這位博主的博客,里面有詳細(xì)的IText 設(shè)置段落,標(biāo)題,表格,加密..........只要你能在生成PDF想到的,這里面基本上都有。

? 博客地址:http://rensanning.iteye.com/blog/1538689

3.iTextRenderer(Flying Saucer) HTML轉(zhuǎn)PDF

??Flying saucer 做為HTML渲染PDF的開源項(xiàng)目(老外起名字我也是醉了,想起一出是一出,HTML 渲染 PDF起個"飛行器")。

? 其中的核心類 iTextRenderer 支持將HTML生成PDF。

? iTextRenderer 在依賴 iText 的基礎(chǔ)上,單獨(dú)實(shí)現(xiàn)了HTML渲染PDF,基本上能實(shí)現(xiàn) CSS 2.1的整體性,并且完全符合 W3C 規(guī)范。

? 如果采用這種方式,編譯輸出調(diào)整樣式什么的,就讓它見鬼去吧。

? 具體的流程如下圖:

??

? ? ?這才是高大上的解決方案有木有,模版引擎現(xiàn)在也是玲瑯滿目(freemark,velocity.......),具體看你們項(xiàng)目吧。

? ? ?這樣就不用為繁瑣的樣式發(fā)愁了,定義模版前端查看,注入數(shù)據(jù),生成PDF,核心代碼:

ITextRenderer iTextRenderer = new ITextRenderer();iTextRenderer.getFontResolver().addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);iTextRenderer.setDocument(new File(currWebcontentPath + reviewHtmlPath).toURI().toString());iTextRenderer.layout();String pdfName = getPdfName(testVO);OutputStream fileOutputStream = new FileOutputStream(currWebcontentPath + pdfPath + pdfName);iTextRenderer.createPDF(fileOutputStream);iTextRenderer.finishPDF();

? ? 這里面需要解決的問題還有生成的HTML存放的位置,然后就是跳轉(zhuǎn)到下載頁面了,如果你是JavaEE后端開發(fā),這些問題應(yīng)該都難不到你。

? ? 使用的iTextRenderer的jar同樣也放到:?http://pan.baidu.com/s/1kTOpM0R? 提取密碼: y9y2

? ? 具體參考的博客有:

? ??http://www.tuicool.com/articles/qAFNFja

? ??http://downpour.iteye.com/blog/509417

? ? http://my.oschina.net/u/603602/blog/268611?fromerr=bxBuHc6W

轉(zhuǎn)載于:https://www.cnblogs.com/java-class/p/5233243.html

總結(jié)

以上是生活随笔為你收集整理的生成 PDF 全攻略【1】初体验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。