java實現自動靜默打印功能


 最近接到一個需求,要求實現自動打印功能,一般網頁打印pdf需要借助瀏覽器的pdf組件,而且還要彈出打印窗口,再點擊打印才能實現。

那么如何實現自動打印了,從點擊自己網頁上3次縮減到點擊一次了?

一.實現思路:

        1.讀取本地打印機服務

        2. 服務端打印肯定不行需要一個客戶端

        3.應用程序需要和本地打印服務通信,發送不同的打印指令

       本想自己用Python寫一個打印控件的,但是時間來不及啊。。

二.采用技術知識

     (以自動打印pdf為例)

  1. java操作文件流
  2. javascripte
  3. pdfjs                       
  4. Lodop打印控件       http://www.lodop.net/

三.技術細節

  1.  關於lodop預覽打印是開源免費,但是靜默打印是需要收費的,直接使用靜默打印會在打印紙張最下面出現水印,我們只需要將打印機紙張大小就可以將水印打印在無效位置,這樣在打印的結果上就不會出現水印了
  2. pdfjs使用版本不能太高,我這里使用  1.4.137。ps:如果找不到對應版本請與評論與我聯系,我分享給大家

四.上代碼

一.后端核心方法主要是將pdf文件轉成base64編碼

 public static String encodeBase64File(File file) throws Exception {
        FileInputStream inputFile = new FileInputStream(file);
        byte[] buffer = new byte[(int)file.length()];
        inputFile.read(buffer);
        inputFile.close();
        return new BASE64Encoder().encode(buffer);
    }

 

二.前端核心代碼

1.在html文件body需要插入

<canvas id="thepdfcanvas2" style="display:none;"></canvas>

 

2. 需要在html頁面引入lodop打印js,pdfjs

<script type="text/javascript" src="../static/js/print/LodopFuncs.js"></script>
<script type="text/javascript" src="../static/js/pdfjs-dist/build/pdf.js"></script>
<script type="text/javascript">
var LODOP=getLodop(document.getElementById('LODOP_OB'),document.getElementById('LODOP_EM'));
</script>

 

  

  3.發送ajax請求向后端返回pdf文件流,通過pdfjs繪制pdf成圖片可以進行屬性調節,進而調用print靜默打印

function printOneURL(pdfUrl,preview){
    var params = {"path": pdfUrl};
    $.sendDefaultAjax(jsPPath + "/printModel/print.do", params,function (data) {
        if (data.code === 0) {
            var  pdfData = atob(data.msg);
            PDFJS.workerSrc =
                '../static/js/pdfjs-dist/build/pdf.worker.js';
            //從pdf文件對象逐頁獲取page,並調用toImageAndPrint函數打印內容
            PDFJS.getDocument({data: pdfData}).then(function getPdfHelloWorld(pdf) {
                //此適用pdf只有一個page情況
                pdf.getPage(1).then(function getPageHelloWorld(page) {
                    //scale調節生成的畫布圖片大小,與清晰度有關,需要調整。
                    var scale = 5.5;
                    var viewport = page.getViewport(scale);
                    //將生成的page對象加載到canvas中
                    var canvas = document.getElementById('thepdfcanvas2');
                    var context = canvas.getContext('2d');
                    canvas.height = viewport.height;
                    canvas.width = viewport.width;

                    var renderContext = {
                        canvasContext: context,
                        viewport: viewport
                    };
                    //此處開始畫畫布
                    page.render(renderContext).promise.then(function(){
                        //回調函數,此處畫布已加載完,調用后續的打印或預覽函數
                        simplePrint(preview); //直接打印
                    });
                });
            });
        }else {
            layer.msg(data.msg, {icon: 2});
        }
    });

};


//preview為true就是預覽打印,默認是直接打印

function simplePrint(preview) {
    var canvasEle = document.getElementById("thepdfcanvas2");
    var dataURL = canvasEle.toDataURL();
    LODOP.PRINT_INIT();
    LODOP.SET_PRINT_PAGESIZE(1, 0, 0, "A6");
    LODOP.SET_PRINT_STYLE("Stretch", 2);
    LODOP.ADD_PRINT_IMAGE("0mm", "0mm", "RightMargin:0mm", "BottomMargin:0mm", dataURL);
    if (preview) {
        LODOP.PREVIEW();
    } else {
        LODOP.PRINT();
    }
}

 

如果大家有什么問題可以提出來,一起交流,學習。有什么不對的地方也指出來,我也虛心學習。

自己也是又開始寫博客了,您們的贊是我寫博客的動力,謝謝大家。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM