安卓打印實現打印pdf文檔


先聲明一下,此處的打印非pos打印機打印和藍牙打印機打印,如果想查找打印小票的pos打印機請進入下面的傳送門,藍牙打印目前沒做過,有做過的請指教。

pos打印機傳送門:

1. https://www.cnblogs.com/LIANQQ/p/4587637.html

2.https://www.ibm.com/developerworks/cn/java/j-lo-pos/index.html

目前要實現的功能是類似於電腦上的文檔打印,pdf、word、excel、ppt等,下面的例子僅實現了pdf。

但是要注意一點,此種方案僅適用於android4.4以上版本,低於android4.4不支持。

並且如果系統版本低於android9.0需要安裝支持所使用打印機的print Service才可以打印,而android9.0以上設備可以不用安裝。

關於為什么要安裝print service,請看傳送門 https://juejin.im/post/5a24b18df265da432840afc9

其中安卓也提供了一些用於實現打印服務的接口類,傳送門https://developer.android.google.cn/reference/android/printservice/package-summary,如果你足夠厲害,也可以做一個print service來兼容多種打印機,其實有公司做過,不過隨着時間推移很多都不與現在的打印機兼容來,有興趣的可以試試PrintShare等軟件,如果不理想,那就還是下載打印機官方提供的 print service吧。

由於目前的辦公環境,我安裝了兩款打印服務插件,一個是惠普的,一個是佳能的。名稱分別如圖所示,我是從酷安下載的,當然你從別的地方下載也可以:

 

安裝完成后到系統設置--打印--找到對應的服務,如圖

點擊對應的打印服務,有的可以直接掃描到局域網的打印機,直接添加,有的需要手動輸入IP地址添加

添加完成后打印的服務就算是有了,然后就是代碼實現了。

在所有打印機可以看到新添加的打印機:

如果不確定這個添加好的打印機能不能打印,可以先下載一個wps,然后隨便創建一個文檔進行打印測試以下。

wps打印按鈕的位置如圖

好了,如果你不是開發者,看到這里你就可以用wps打印pdf、word、excel、ppt之類的文件了。

 

但是作為開發者我們怎樣才能在程序里調用這個系統打印服務呢?

有人寫好了pdf的,我也只是搬一下磚,具體連接在此:https://blog.csdn.net/tangxl2008008/article/details/78424867 

文章寫的很詳細了,但是文章中介紹的 Mopria PrintService 已經不能用了,我簡單介紹下:

其實就是使用了安卓系統的PrintManager調用系統打印服務,不過傳參數的時候有一個PrintDocumentAdapter需要自定義,這個adapter其實就是一個適配器抽象類,通過實現這個抽象類來達到打印不同格式的文檔的目的(pdf、word、excel等)。具體這個類的使用方式見中文翻譯:http://hukai.me/android-training-course-in-chinese/multimedia/printing/custom-docs.html

調用過程可以移植到代碼里,如下:

1 private void doPdfPrint(String filePath) {
2     PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
3     MyPrintPdfAdapter myPrintAdapter = new MyPrintPdfAdapter(filePath);
4     printManager.print("jobName", myPrintAdapter, null);
5 }

 

如果使用pdf打印的話可以直接使用這篇文章里的MyPrintPdfAdapter,如果想打印其他文檔請自行繼承PrintDocumentAdapter。

 

既然寫完了,測試是什么樣子呢?

點來打印后會直接出現下面的圖,選擇對應的打印機然后點那個綠色的打印按鈕就可以了。

 

 

好了,先總結到這,時間緊迫,又該搬磚去了,有問題請留言。

 

更正一下,Mopria Print Service國內版搜索不可用,但是google play有對應版本,有能力上牆的請訪問

https://play.google.com/store/apps/details?id=org.mopria.printplugin&hl=zh

 

更新

由於我們的程序不僅要實現pdf打印,可能還要實現doc、xls、ppt的打印,以上方法可能就不試用了。

下面的連接提供了幾種方法,bitmap打印、view截圖打印、webview內容打印,而我們顯示doc等文檔使用的是QQ的X5內核的webview,所以要打印文檔,只需要支持webview顯示即可。

https://www.jianshu.com/p/d82bd61b11a4

簡單總結如下:

bitmap打印使用PrintHelper

PrintHelper photoPrinter = new PrintHelper(getActivity());  
 photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);  
 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droids);  
 photoPrinter.printBitmap("droids.jpg - test print", bitmap); 

webview打印使用PrintedPdfDocument

PrintAttributes attributes = new PrintAttributes.Builder()
                            .setMediaSize(PrintAttributes.MediaSize.ISO_A4)
                            .setResolution(new PrintAttributes.Resolution("id", Context.PRINT_SERVICE, 300, 300))
                            .setColorMode(PrintAttributes.COLOR_MODE_COLOR)
                            .setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0))
                            .build();
     PdfDocument document = new PrintedPdfDocument(context, attributes);
    for (int i = 0; i < numberOfPages; i++) {
        int webMarginTop = i * letterSizeHeight;

        PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(webViewWidth, letterSizeHeight, i + 1).create();
        PdfDocument.Page page = document.startPage(pageInfo);
        page.getCanvas().translate(0, -webMarginTop);
        webView.draw(page.getCanvas());

        document.finishPage(page);
    }
    document.writeTo(getOutputStream());
    document.close();

 另外一種方式就是通過在線把office文件轉pdf,然后通過webview加載pdf就可以實現office文件的瀏覽了,然后也可以通過轉化成pdf來打印了

在線轉pdf連接 https://www.cnblogs.com/woider/p/7003481.html  

我的github地址:https://github.com/dongweiq/

歡迎關注,歡迎star o(∩_∩)o 。有什么問題請郵箱聯系 dongweiqmail@gmail.com qq714094450

 


免責聲明!

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



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