先聲明一下,此處的打印非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