最近作一個項目,是關於報告之類的,涉及到報告打印這個功能,真是坑了個爹啊。在網上找了不少方法,web打印有不少控件,如:傑表打印,lodop,等等。由於業務上的報表表格都是一些word文檔,其內容也很是之多。基本上表格,複合表格之類的。數據量不定,因此分頁也必須考慮上。javascript
首先考慮,傑表打印,由於lodop網上有網頁說對css支持很差。傑表打印免費版確實是良心之做啊,收費版我沒有用過。經過程序在html輸出內容並分好頁,每一頁放在一個<div id="page1"></div>這裏就不粘代碼了。確實是挺簡單的也很好用,安裝好插件後,直調調用。php
myDoc = { documents: document, settings:{topMargin:0, leftMargin:0, bottomMargin:0, rightMargin:0}, // 設置上下左距頁邊距爲10毫米,注意,單位是 1/10毫米 /* 要打印的div 對象在本文檔中,控件將從本文檔中的 id 爲 'page1' 的div對象, 做爲首頁打印id 爲'page2'的做爲第二頁打印 */ copyrights: '傑創軟件擁有版權 www.jatools.com' // 版權聲明,必須 }; var jatoolsPrinter = document.getElementById("jatoolsPrinter"); jatoolsPrinter.printPreview(myDoc); // 打印預覽
這樣就能夠打印了,可是免費版本有個問題,在不一樣分辨率上字體,大小常常不同,帶來了一個問題:調好了A機子B機子又不行,老是達不到理想的效果。因爲收費版貴,也不知道效果如何,因此就沒有購買了。將就着用了一段時間。css
前不久,在網上找到了一個神器《wxhtmltopdf》,直接將html生成pdf,而且直接javascript腳本運行。分頁也不在話下。最主要是頁面調好的佈局,生成後無變型,字體大小一致。哇草,這太合適個人需求了吧。去官網一看,跨平臺,牛啊,媽媽不再用擔憂什麼window,linux,mac os了,百度一搜安裝方法一堆,果斷試試。html
wkhtmltopdf http://www.baidu.com baidu.pdfjava
就這麼簡單,pdf就生成了,並且效果很好。就他了。linux
下來就是怎麼在程度上調用的問題了。這個很簡單,java php C#都有方法。直接用啊,我這裏用的是java的。web
public class HtmlToPdfInterceptor extends Thread { private InputStream is; public HtmlToPdfInterceptor(InputStream is){ this.is = is; } public void run(){ try{ InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { // System.out.println(line.toString()); //輸出內容 } }catch (IOException e){ e.printStackTrace(); } } }
/** * html轉pdf * * @param srcPath html路徑,能夠是硬盤上的路徑,也能夠是網絡路徑 * @param destPath pdf保存路徑 * @return 轉換成功返回true */ public static boolean convert_landscape(String srcPath, String destPath) { File file = new File(destPath); File parent = file.getParentFile(); //若是pdf保存路徑不存在,則建立路徑 if (!parent.exists()) { parent.mkdirs(); } StringBuilder cmd = new StringBuilder(); cmd.append(toPdfTool); cmd.append(" --page-size A4 "); //設置紙張; cmd.append(" --orientation Landscape "); //方向; cmd.append(" --margin-top 10px --margin-right 10px --margin-bottom 10px --margin-left 10px ");//設置邊距 cmd.append(srcPath); cmd.append(" "); cmd.append(destPath); boolean result = true; try { Process proc = Runtime.getRuntime().exec(cmd.toString()); HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream()); HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream()); error.start(); output.start(); proc.waitFor(); } catch (Exception e) { result = false; e.printStackTrace(); } return result; }
就這兩個方法,把http的鏈接傳入便可。chrome
好了,pdf有了,那就是查看,打印的問題。這裏又坑爹的問題,chrome上能夠直接瀏覽pdf而且打印,但萬惡的IE就沒有那麼爽了。可是不是沒有辦法解決,考慮到使用的用戶大多習慣於IE或360之類的,因此IE上的打印仍是得解決。網絡
第一次選擇了pdf.js,說實話,這些控件都很好,用起來也很是方便,只是有一些問題實在是折騰人了。我使用了pdf.js在IE,chrome瀏覽都很好,打印就不行了,IE直接不輸出內容,chrome打印出來的內容失真了。沒有時間去研究究竟是什麼問題形成的。換吧。app
第二次選擇了pdfobject.js,先說明一下pdf.js的確實方法,無需安裝任何插件就能夠瀏覽。但pdfobject.js就不行了,在IE下須要安裝Adobe Acrobat Reader DC,
而後就是pdfoject.js的使用了。
<body > <script> var option = { fallbackLink: "<p>has error</p>", pdfOpenParams:{ view: 'FitV', zoom:"80", pagemode:"none" } } PDFObject.embed("${root!}${pdf_path!}", document.body,option); </script>
就這一句,embed第一個參數就是pdf的鏈接,IE下adobe reader 默認不是預覽模式,界面不少功能菜單,很是地醜。
在配置的時候記得要把:pagemode:"none"這句加上,具體的參數可參考下面的說明文檔。
http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf
加上後,效果扛扛的。
至此,web打印的問題解決了。