亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現PDF預覽打印功能

2019-10-21 21:32:44
字體:
來源:轉載
供稿:網友

最近在做一個項目,需要用到android手機連接打印機進行打印的功能,目前在網上找到的教程介紹的都是藍牙連接熱敏打印機(pos機大小的打印機)和藍牙打印機,如果連接日常所見到的網絡打印機,進行打印,很顯然這些教程是做不到的。 

由于android沒有提供任何標準,都是自家封的API,參考了WPS的APP的打印功能,決定按照WPS的方案來寫,需要安裝打印服務插件,比如PrinterShare以及三星、HP提供的自家打印服務插件。

一、連接打印管理者

  當程序需要直接管理打印進程時,在收到用戶的打印請求之后,第一步就是連接Android的打印框架,以及操作PrintManager類的實例。這個類允許你實例化一個打印工作并開始打印的生命過程。下面的代碼展示了如何獲得一個打印管理者和啟動打印進程。

private void onPrintPdf() {    PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);    PrintAttributes.Builder builder = new PrintAttributes.Builder();    builder.setColorMode(PrintAttributes.COLOR_MODE_COLOR);    printManager.print("test pdf print", new MyPrintAdapter(this,filePath), builder.build());  }

二、創建打印適配器

  打印適配器會與Android的打印框架相連接,并會處理打印過程的每一個步驟。這個過程要求用戶在創建文檔打印之前選擇打印機及相關的打印選項。這些過程會影響最終的輸出結果,就像用戶選擇了不同打印能力,不同的頁面尺寸,不同的頁面方向一樣。隨著這些選項的設置,打印框架會要求適配器展示并生成一個打印文稿,為最終的打印做準備。一旦用戶按下了打印按鈕,打印框架會拿到最終的打印文檔然后交付給打印提供者以便打印。

 

package com.android.guocheng.printdemo;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.pdf.PdfDocument;import android.graphics.pdf.PdfDocument.PageInfo;import android.graphics.pdf.PdfRenderer;import android.os.Bundle;import android.os.CancellationSignal;import android.os.ParcelFileDescriptor;import android.print.PageRange;import android.print.PrintAttributes;import android.print.PrintDocumentAdapter;import android.print.PrintDocumentInfo;import android.print.pdf.PrintedPdfDocument;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;/** * Created by guocheng on 2017/6/13. */public class MyPrintAdapter extends PrintDocumentAdapter {  private Context context;  private int pageHeight;  private int pageWidth;  private PdfDocument mPdfDocument;  private int totalpages = 1;  private String pdfPath;  private List<Bitmap> mlist;  public MyPrintAdapter(Context context,String pdfPath) {    this.context = context;    this.pdfPath = pdfPath;  }  @Override  public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal,             LayoutResultCallback callback,             Bundle metadata) {    mPdfDocument = new PrintedPdfDocument(context, newAttributes); //創建可打印PDF文檔對象    pageHeight = newAttributes.getMediaSize().ISO_A4.getHeightMils() * 72 / 1000; //設置尺寸    pageWidth = newAttributes.getMediaSize().ISO_A4.getWidthMils() * 72 / 1000;    if (cancellationSignal.isCanceled()) {      callback.onLayoutCancelled();      return;    }    ParcelFileDescriptor mFileDescriptor = null;    PdfRenderer pdfRender = null;    PdfRenderer.Page page = null;    try {      mFileDescriptor = ParcelFileDescriptor.open(new File(pdfPath), ParcelFileDescriptor.MODE_READ_ONLY);      if (mFileDescriptor != null)        pdfRender = new PdfRenderer(mFileDescriptor);      mlist = new ArrayList<>();      if (pdfRender.getPageCount() > 0) {        totalpages = pdfRender.getPageCount();        for (int i = 0; i < pdfRender.getPageCount(); i++) {          if(null != page)            page.close();          page = pdfRender.openPage(i);          Bitmap bmp = Bitmap.createBitmap(page.getWidth()*2,page.getHeight()*2, Bitmap.Config.ARGB_8888);          page.render(bmp, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);          mlist.add(bmp);        }      }      if(null != page)        page.close();      if(null != mFileDescriptor)        mFileDescriptor.close();      if (null != pdfRender)        pdfRender.close();    } catch (FileNotFoundException e) {      e.printStackTrace();    } catch (IOException e) {      e.printStackTrace();    }    if (totalpages > 0) {      PrintDocumentInfo.Builder builder = new PrintDocumentInfo          .Builder("快速入門.pdf")          .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)          .setPageCount(totalpages); //構建文檔配置信息      PrintDocumentInfo info = builder.build();      callback.onLayoutFinished(info, true);    } else {      callback.onLayoutFailed("Page count is zero.");    }  }  @Override  public void onWrite(final PageRange[] pageRanges, final ParcelFileDescriptor destination, final CancellationSignal cancellationSignal,            final WriteResultCallback callback) {    for (int i = 0; i < totalpages; i++) {      if (pageInRange(pageRanges, i)) //保證頁碼正確      {        PageInfo newPage = new PageInfo.Builder(pageWidth,            pageHeight, i).create();        PdfDocument.Page page =            mPdfDocument.startPage(newPage); //創建新頁面        if (cancellationSignal.isCanceled()) { //取消信號          callback.onWriteCancelled();          mPdfDocument.close();          mPdfDocument = null;          return;        }        drawPage(page, i); //將內容繪制到頁面Canvas上        mPdfDocument.finishPage(page);      }    }    try {      mPdfDocument.writeTo(new FileOutputStream(          destination.getFileDescriptor()));    } catch (IOException e) {      callback.onWriteFailed(e.toString());      return;    } finally {      mPdfDocument.close();      mPdfDocument = null;    }    callback.onWriteFinished(pageRanges);  }  private boolean pageInRange(PageRange[] pageRanges, int page) {    for (int i = 0; i < pageRanges.length; i++) {      if ((page >= pageRanges[i].getStart()) &&          (page <= pageRanges[i].getEnd()))        return true;    }    return false;  }  //頁面繪制(渲染)  private void drawPage(PdfDocument.Page page,int pagenumber) {    Canvas canvas = page.getCanvas();    if(mlist != null){      Paint paint = new Paint();      Bitmap bitmap = mlist.get(pagenumber);      int bitmapWidth = bitmap.getWidth();      int bitmapHeight = bitmap.getHeight();      // 計算縮放比例      float scale = (float)pageWidth/(float)bitmapWidth;      // 取得想要縮放的matrix參數      Matrix matrix = new Matrix();      matrix.postScale(scale, scale);      canvas.drawBitmap(bitmap,matrix,paint);    }  }}

最后看一下效果圖

Android,PDF,預覽打印

通過打印服務插件添加打印機就可以進行打印了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产伦精品一区二区三区精品视频| 欧美激情亚洲视频| 日本久久亚洲电影| 国产视频在线一区二区| x99av成人免费| 中文欧美日本在线资源| 高跟丝袜欧美一区| 日韩欧美中文第一页| 亚洲第一网站免费视频| 精品成人国产在线观看男人呻吟| 538国产精品一区二区在线| 国产精品人成电影| 亚洲精品视频在线观看视频| 98精品国产高清在线xxxx天堂| 成人日韩在线电影| 久久国产精品久久久久久久久久| 国产视频久久网| 久久精品国产久精国产思思| 久久精品影视伊人网| 国产又爽又黄的激情精品视频| 欧美精品videossex性护士| 久久久久久久一区二区| 欧美国产视频日韩| 午夜美女久久久久爽久久| www.欧美精品一二三区| 91av视频在线| 色香阁99久久精品久久久| 欧美高清性猛交| 性日韩欧美在线视频| 亚洲欧洲第一视频| 国产精品国产福利国产秒拍| 668精品在线视频| 久久精品99久久久久久久久| 丝袜一区二区三区| 中文字幕精品一区久久久久| 久久资源免费视频| 在线视频欧美性高潮| 久久免费精品日本久久中文字幕| 国产精品日日做人人爱| 亚洲精品国精品久久99热一| 亚洲va欧美va国产综合久久| 亚洲国产精品久久久久久| 欧美猛交ⅹxxx乱大交视频| 久久久女女女女999久久| 国产成人亚洲精品| 日韩免费观看在线观看| 成人福利网站在线观看11| 日韩中文字幕国产| 久久精品视频在线| 国产丝袜一区二区三区免费视频| 亚洲精品国产福利| 成人h视频在线观看播放| 欧美亚洲视频在线观看| 九色精品美女在线| 久久av.com| 国产经典一区二区| 国产欧美一区二区三区视频| 欧美视频在线免费看| 在线观看91久久久久久| 久久色免费在线视频| 久久久影视精品| 欧美肥婆姓交大片| 精品国产一区久久久| 亚洲国产高潮在线观看| 精品国产老师黑色丝袜高跟鞋| 日韩精品在线观看网站| 亚洲欧美资源在线| 2019中文字幕全在线观看| 国产精品久久久久久久av电影| 在线视频精品一| 日韩精品极品在线观看播放免费视频| 欧美电影免费在线观看| 国产在线久久久| 久久91亚洲精品中文字幕| 日韩中文第一页| 欧美电影在线播放| 亚洲影院色无极综合| 亚洲成人性视频| 国产激情综合五月久久| 亚洲伊人一本大道中文字幕| 一区二区在线视频| 精品国产依人香蕉在线精品| 菠萝蜜影院一区二区免费| 中文字幕一区电影| 成人午夜高潮视频| 久久精品电影一区二区| 日韩精品在线观看一区| 久久中国妇女中文字幕| 日韩视频在线一区| 欧美国产高跟鞋裸体秀xxxhd| 日韩精品免费在线观看| 久久久精品视频在线观看| 亚洲v日韩v综合v精品v| 日韩国产激情在线| 亚洲人精品午夜在线观看| 中文字幕日韩在线视频| 亚洲综合第一页| 一区二区中文字幕| 成人福利网站在线观看| 国产精品久久97| 日韩高清电影好看的电视剧电影| 日韩大陆毛片av| 97欧美精品一区二区三区| 亚洲国产精品成人va在线观看| 亚洲欧美一区二区激情| 国产99在线|中文| 福利一区福利二区微拍刺激| 亚洲性av在线| 久久理论片午夜琪琪电影网| 91精品免费看| 中文亚洲视频在线| 成人国产精品av| 亚州成人av在线| 黑人狂躁日本妞一区二区三区| 欧美激情a∨在线视频播放| 亚洲国产精品悠悠久久琪琪| 成人黄色av免费在线观看| 精品久久久久久亚洲国产300| 3344国产精品免费看| 国产一区二区三区在线观看网站| 亚洲欧洲日本专区| 亚洲美女www午夜| 欧美www视频在线观看| 国产成人福利夜色影视| 国产一区二区视频在线观看| 欧美精品少妇videofree| 日韩在线高清视频| 国产精品一区二区久久国产| 国产精品免费一区二区三区都可以| 日韩精品中文字幕视频在线| 激情久久av一区av二区av三区| 日韩福利伦理影院免费| 永久免费毛片在线播放不卡| 国产va免费精品高清在线观看| 欧美亚洲第一页| www.99久久热国产日韩欧美.com| 亚洲精品电影在线| 国产高清视频一区三区| 欧美日韩福利视频| 久久久亚洲影院你懂的| 成人黄色生活片| 91国自产精品中文字幕亚洲| 亚洲欧洲在线看| 国产精品美女久久| 欧美裸体男粗大视频在线观看| 久久97久久97精品免视看| 在线观看日韩www视频免费| 亚洲аv电影天堂网| 国产精品精品久久久| 国产一区二区欧美日韩| 欧美国产第一页| 55夜色66夜色国产精品视频| 久久久精品国产| 色偷偷av一区二区三区乱| 国产精品中文字幕在线观看| 69久久夜色精品国产7777| 欧美国产中文字幕| 国产日本欧美一区二区三区| 性色av香蕉一区二区| 日韩av在线免费观看一区| 国产视频亚洲精品| 尤物yw午夜国产精品视频明星| 国产精品在线看| 5252色成人免费视频|