Android PDF 미리 보기 인쇄 기능 구현
안 드 로 이 드 는 어떠한 기준 도 제공 하지 않 았 고 모두 자체 봉 인 된 API 이기 때문에 WPS 의 APP 인쇄 기능 을 참고 하여 WPS 의 방안 에 따라 쓰기 로 결정 했다.예 를 들 어 PrinterShare 와 삼 성,HP 가 제공 하 는 자체 인쇄 서비스 플러그 인 등 인쇄 서비스 플러그 인 을 설치 해 야 한다.
1.인쇄 관리자 연결
프로그램 이 인쇄 프로 세 스 를 직접 관리 해 야 할 때 사용자 의 인쇄 요청 을 받 은 후 첫 번 째 단 계 는 안 드 로 이 드 를 연결 하 는 인쇄 프레임 워 크 와 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());
}
2.인쇄 어댑터 만 들 기인쇄 어댑터 는 안 드 로 이 드 의 인쇄 프레임 워 크 와 연결 되 며 인쇄 과정의 모든 절 차 를 처리 합 니 다.이 과정 은 사용자 가 문서 인쇄 를 만 들 기 전에 프린터 와 관련 된 인쇄 옵션 을 선택 하도록 요구 합 니 다.이러한 과정 은 사용자 가 서로 다른 인쇄 능력,서로 다른 페이지 크기,서로 다른 페이지 방향 을 선택 한 것 처럼 최종 출력 결과 에 영향 을 줄 수 있다.이 옵션 들 이 설정 되면 서 인쇄 프레임 워 크 는 어댑터 에 인쇄 원 고 를 보 여주 고 생 성하 여 최종 인쇄 를 준비 하도록 요구 합 니 다.사용자 가 인쇄 단 추 를 누 르 면 인쇄 프레임 워 크 는 최종 인쇄 문 서 를 받 아 인쇄 공급 자 에 게 전달 합 니 다.
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);
}
}
}
마지막 으로 효과 도 한번 볼 게 요.인쇄 서비스 플러그 인 을 통 해 프린터 를 추가 하면 인쇄 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.