Android 시스템 인쇄 기능 구현

본 논문 의 사례 는 안 드 로 이 드 가 시스템 인쇄 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
그림 인쇄
PrintHelper 클래스 사용 하기:

private void doPhotoPrint() {
 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);
}
응용 메뉴 표시 줄 에서 이 방법 을 호출 할 수 있 습 니 다.printBitmap()방법 이 호출 될 때 Android 시스템 의 인쇄 인터페이스
팝 업 됩 니 다.사용 자 는 파 라 메 터 를 설정 한 다음 인쇄 하거나 취소 할 수 있 습 니 다.
2.사용자 정의 문서 인쇄
1.PrintManager 클래스 에 연결:

private void doPrint() {
 // Get a PrintManager instance
 PrintManager printManager = (PrintManager) getActivity()
   .getSystemService(Context.PRINT_SERVICE);
 
 // Set job name, which will be displayed in the print queue
 String jobName = getActivity().getString(R.string.app_name) + " Document";
 
 // Start a print job, passing in a PrintDocumentAdapter implementation
 // to handle the generation of a print document
 printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()),
   null); //
}
주:print 함수 두 번 째 매개 변 수 는 추상 류 PrintDocumentAdapter 의 어댑터 류 를 계승 하 는 것 이 고 세 번 째 매개 변 수 는 PrintAttributes 대상 입 니 다.
인쇄 할 때의 속성 을 설정 할 수 있 습 니 다.
2.인쇄 어댑터 클래스 만 들 기
인쇄 어댑터 와 안 드 로 이 드 시스템 의 인쇄 프레임 워 크 가 상호작용 을 하고 인쇄 의 생명주기 방법 을 처리 합 니 다.인쇄 과정 은 주로 다음 과 같은 생명주기 방법 이 있다.
  • onStart():인쇄 과정 이 시 작 될 때 호출 합 니 다.
  • onLayout():사용자 가 인쇄 설정 을 변경 하여 인쇄 결과 가 바 뀌 었 을 때 호출 합 니 다.예 를 들 어 종이 크기,종이 방향 등 입 니 다.
  • onWrite():인쇄 할 결 과 를 파일 에 기록 할 때 호출 합 니 다.이 방법 은 onLayout()호출 될 때마다 한 번 또는 여러 번 호출 됩 니 다.
  • onFinish():인쇄 과정 이 끝 날 때 호출 합 니 다.
  • 주:관건 적 인 방법 은 onLayout()와 onWrite()가 있 습 니 다.이 방법 들 은 기본적으로 메 인 스 레 드 에서 호출 되 기 때문에 인쇄 과정 이 오래 걸 리 면 배경 스 레 드 에서 진행 해 야 합 니 다.
    3.onLayout()덮어 쓰 는 방법
    onLayout()방법 에서 어댑터 는 시스템 프레임 워 크 텍스트 형식,총 페이지 수 등 정 보 를 알려 야 합 니 다.예 를 들 어:
    
    @Override
    public void onLayout(PrintAttributes oldAttributes,
          PrintAttributes newAttributes,
          CancellationSignal cancellationSignal,
          LayoutResultCallback callback,
          Bundle metadata) {
     // Create a new PdfDocument with the requested page attributes
     mPdfDocument = new PrintedPdfDocument(getActivity(), newAttributes);
     
     // Respond to cancellation request
     if (cancellationSignal.isCancelled() ) {
      callback.onLayoutCancelled();
      return;
     }
     
     // Compute the expected number of printed pages
     int pages = computePageCount(newAttributes);
     
     if (pages > 0) {
      // Return print information to print framework
      PrintDocumentInfo info = new PrintDocumentInfo
        .Builder("print_output.pdf")
        .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
        .setPageCount(pages);
        .build();
      // Content layout reflow is complete
      callback.onLayoutFinished(info, true);
     } else {
      // Otherwise report an error to the print framework
      callback.onLayoutFailed("Page count calculation failed.");
     }
    }
    주:onLayout()방법의 실행 은 완료,취소,실패 세 가지 결과 가 있 습 니 다.PrintDocumentAdapter.Layout ResultCallback 류 를 호출 하 는 적당 한 리 셋 방법 으로 실행 결 과 를 표시 해 야 합 니 다.onLayout Finished()방법의 불 형 매개 변 수 는 레이아웃 내용 이 바 뀌 었 는 지 여 부 를 표시 해 야 합 니 다.
    
    onLayout()                 ,       ,            :
    private int computePageCount(PrintAttributes printAttributes) {
     int itemsPerPage = 4; // default item count for portrait mode
     
     MediaSize pageSize = printAttributes.getMediaSize();
     if (!pageSize.isPortrait()) {
      // Six items per page in landscape orientation
      itemsPerPage = 6;
     }
     
     // Determine number of print items
     int printItemCount = getPrintItemCount();
     
     return (int) Math.ceil(printItemCount / itemsPerPage);
    }
    4.덮어 쓰기()방법
    인쇄 결 과 를 파일 에 출력 해 야 할 때 시스템 은 onWrite()방법 을 사용 합 니 다.이 방법 은 인쇄 할 페이지 와 결 과 를 기록 할 파일 을 가리 키 는 매개 변수 입 니 다.페이지 의 내용 을 여러 페이지 의 PDF 문서 에 기록 해 야 하 는 방법 을 실현 합 니 다.이 과정 이 끝 났 을 때 onWrite Finished()방법 을 사용 해 야 합 니 다.예 를 들 어:
    
    @Override
    public void onWrite(final PageRange[] pageRanges,
         final ParcelFileDescriptor destination,
         final CancellationSignal cancellationSignal,
         final WriteResultCallback callback) {
     // Iterate over each page of the document,
     // check if it's in the output range.
     for (int i = 0; i < totalPages; i++) {
      // Check to see if this page is in the output range.
      if (containsPage(pageRanges, i)) {
       // If so, add it to writtenPagesArray. writtenPagesArray.size()
       // is used to compute the next output page index.
       writtenPagesArray.append(writtenPagesArray.size(), i);
       PdfDocument.Page page = mPdfDocument.startPage(i);
     
       // check for cancellation
       if (cancellationSignal.isCancelled()) {
        callback.onWriteCancelled();
        mPdfDocument.close();
        mPdfDocument = null;
        return;
       }
     
       // Draw page content for printing
       drawPage(page);
     
       // Rendering is complete, so page can be finalized.
       mPdfDocument.finishPage(page);
      }
     }
     
     // Write PDF document to file
     try {
      mPdfDocument.writeTo(new FileOutputStream(
        destination.getFileDescriptor()));
     } catch (IOException e) {
      callback.onWriteFailed(e.toString());
      return;
     } finally {
      mPdfDocument.close();
      mPdfDocument = null;
     }
     PageRange[] writtenPages = computeWrittenPages();
     // Signal the print framework the document is complete
     callback.onWriteFinished(writtenPages);
     
     ...
    }
    drawPage()방법 구현:
    
    private void drawPage(PdfDocument.Page page) {
     Canvas canvas = page.getCanvas();
     
     // units are in points (1/72 of an inch)
     int titleBaseLine = 72;
     int leftMargin = 54;
     
     Paint paint = new Paint();
     paint.setColor(Color.BLACK);
     paint.setTextSize(36);
     canvas.drawText("Test Title", leftMargin, titleBaseLine, paint);
     
     paint.setTextSize(11);
     canvas.drawText("Test paragraph", leftMargin, titleBaseLine + 25, paint);
     
     paint.setColor(Color.BLUE);
     canvas.drawRect(100, 100, 172, 172, paint);
    }
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기