麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 系統(tǒng) > Android > 正文

Android實(shí)現(xiàn)PDF預(yù)覽打印功能

2019-10-21 21:32:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近在做一個(gè)項(xiàng)目,需要用到android手機(jī)連接打印機(jī)進(jìn)行打印的功能,目前在網(wǎng)上找到的教程介紹的都是藍(lán)牙連接熱敏打印機(jī)(pos機(jī)大小的打印機(jī))和藍(lán)牙打印機(jī),如果連接日常所見(jiàn)到的網(wǎng)絡(luò)打印機(jī),進(jìn)行打印,很顯然這些教程是做不到的。 

由于android沒(méi)有提供任何標(biāo)準(zhǔn),都是自家封的API,參考了WPS的APP的打印功能,決定按照WPS的方案來(lái)寫,需要安裝打印服務(wù)插件,比如PrinterShare以及三星、HP提供的自家打印服務(wù)插件。

一、連接打印管理者

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

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());  }

二、創(chuàng)建打印適配器

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

 

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); //創(chuàng)建可打印PDF文檔對(duì)象    pageHeight = newAttributes.getMediaSize().ISO_A4.getHeightMils() * 72 / 1000; //設(shè)置尺寸    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); //構(gòu)建文檔配置信息      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)) //保證頁(yè)碼正確      {        PageInfo newPage = new PageInfo.Builder(pageWidth,            pageHeight, i).create();        PdfDocument.Page page =            mPdfDocument.startPage(newPage); //創(chuàng)建新頁(yè)面        if (cancellationSignal.isCanceled()) { //取消信號(hào)          callback.onWriteCancelled();          mPdfDocument.close();          mPdfDocument = null;          return;        }        drawPage(page, i); //將內(nèi)容繪制到頁(yè)面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;  }  //頁(yè)面繪制(渲染)  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();      // 計(jì)算縮放比例      float scale = (float)pageWidth/(float)bitmapWidth;      // 取得想要縮放的matrix參數(shù)      Matrix matrix = new Matrix();      matrix.postScale(scale, scale);      canvas.drawBitmap(bitmap,matrix,paint);    }  }}

最后看一下效果圖

Android,PDF,預(yù)覽打印

通過(guò)打印服務(wù)插件添加打印機(jī)就可以進(jìn)行打印了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 第一区免费在线观看 | 成人三级视频在线观看 | 最新av网址在线观看 | 三人弄娇妻高潮3p视频 | 羞羞视频在线免费 | 成人青青草 | 亚洲日本欧美 | 嫩草影院在线观看网站成人 | 欧美黄色一区 | 黄色a级片视频 | 欧美黄色大片免费观看 | 国产 日韩 亚洲 欧美 | 欧美精品久久天天躁 | 亚洲人成电影在线 | 久久精品中文字幕一区二区三区 | 成人精品一区二区 | 91网在线播放 | 色啪综合 | 亚洲乱操 | 露脸各种姿势啪啪的清纯美女 | 国产精品久久久久久久久久三级 | 成人黄色短视频在线观看 | 国产精品久久久久久久四虎电影 | 精品国产91久久久久久 | 在线小视频国产 | 欧美成人免费小视频 | 天天看成人免费毛片视频 | 香蕉视频1024| 精品一区二区久久久久久按摩 | 久色视频网站 | 国产伦精品一区二区三区在线 | 久国产| a级毛片免费观看在线播放 日本aaa一级片 | 欧美成人精品一区二区三区 | 欧美一级性 | 国产91久久久久久 | 免费a级毛片永久免费 | 成人国产精品齐天大性 | 999精品国产 | 久久91亚洲精品久久91综合 | 国产美女自拍av |