曲折的 web 打印解決方法

最近作一個項目,是關於報告之類的,涉及到報告打印這個功能,真是坑了個爹啊。在網上找了不少方法,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打印的問題解決了。

相關文章
相關標籤/搜索