2014-06-09 4 views
4

도움을 요청하고 싶습니다. 내가 원하는 인쇄/PDF 문서를 만듭니다. 하나의 PDF 페이지를 만들고 캔버스를 통해이 페이지에 데이터를 쓸 수 있습니다. 문제는 다른 pdf 페이지를 만들고이 두 번째 페이지에 계속 쓰는 방법을 모른다는 것입니다. 누군가 경험이 있다면 나는이 일로 많은 시간을 할애하여 충분히 도울 것입니다. 내 코드의 https://developer.android.com/reference/android/print/pdf/PrintedPdfDocument.htmlAndroid 4.4 인쇄 프레임 워크를 사용하여 여러 PDF 페이지 인쇄

부분이있다 : 당신이 캔버스에 직접 그림 때문에

private void doPrint(int _docNumber){ 
    docNumber = _docNumber; 
    //get Printmanager instance 
    PrintManager printManager = (PrintManager)this.getSystemService(Context.PRINT_SERVICE); 
    // Set job name, which will be displayed in the print queue 
    String jobName = getString(R.string.app_name) + " dokument"; 
    // Start a print job, passing in a PrintDocumentAdapter implementation 
    // to handle the generation of a print document 
    printManager.print(jobName, new MyPrintDocAdapter(), null); 

    Toast.makeText(getBaseContext(), "Príprava na tlač...", Toast.LENGTH_SHORT).show(); 
} 

public class MyPrintDocAdapter extends PrintDocumentAdapter 
{ 
    Context context; 
    private int pageHeight; 
    private int pageWidth; 
    public PdfDocument myPdfDocument; 

    @Override 
    public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { 
     myPdfDocument = new PrintedPdfDocument(context, newAttributes); 
     pageHeight = newAttributes.getMediaSize().getHeightMils()/1000 * 72; 
     pageWidth = newAttributes.getMediaSize().getWidthMils()/1000 * 72; 

     if (cancellationSignal.isCanceled()) { 
      callback.onLayoutCancelled(); 
      return; 
     } 

     if (totalpages > 0) { 
      PrintDocumentInfo.Builder builder = new PrintDocumentInfo 
        .Builder("Dokument_"+ docNumber + ".pdf") 
        .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) 
        .setPageCount(totalpages); 

      PrintDocumentInfo info = builder.build(); 
      callback.onLayoutFinished(info, true); 
     } else { 
      callback.onLayoutFailed("Počet strán je nula."); 
     } 
    } 

    @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)) 
      { 
       PdfDocument.PageInfo newPage = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, i).create(); 
       PdfDocument.Page page = myPdfDocument.startPage(newPage); 

       if (cancellationSignal.isCanceled()) { 
        callback.onWriteCancelled(); 
        myPdfDocument.close(); 
        myPdfDocument = null; 
        return; 
       } 

       switch (docNumber) { 
        case 1: drawObjednavka(page, i); 
         break; 
        case 2: drawVykaz(page, i); 
         break; 
        default: Toast.makeText(MainActivity.this, "Bad file format",Toast.LENGTH_SHORT).show(); 
      } 
       myPdfDocument.finishPage(page); 
      } 
     } 

     try { 
      myPdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor())); 
     } catch (IOException e) { 
      callback.onWriteFailed(e.toString()); 
      return; 
     } finally { 
      myPdfDocument.close(); 
      myPdfDocument = 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 drawObjednavka(PdfDocument.Page page, int pagenumber) { 

     int verticalPosY = 0; 
     canvas = page.getCanvas(); 
     pagenumber++; // Make sure page numbers start at 1 

     Typeface tf = Typeface.create(Typeface.DEFAULT, Typeface.NORMAL); // there you can change type of font family, if needed PF 
     PdfDocument.PageInfo pageInfo = page.getInfo(); 
     Paint paint = new Paint(); 
     paint.setTypeface(tf); 
     paint.setColor(Color.BLACK); 
     paint.setStrokeWidth(1F); //set line thickness 

     paint.setTextSize(20); 
     paint.setTypeface(Typeface.DEFAULT_BOLD); 
     canvas.drawText("Objednávka", DEFAULT_LEFT_MARGIN_X, 30, paint);... 
+0

확인 해결책을 찾았습니다. 1. 우리는 html로 웹 teplate를 사용할 수 있고, 웹뷰는 더 많은 페이지를 자동으로 할 수 있습니다. 2. 우리는 자체 메서드를 작성하고 xml로 레이아웃을 만들 수 있으며 이러한 데이터는 자체 프로그램으로 pdf에 작성할 수 있습니다. –

답변

0

, 당신은이 totalpages 당신이 필요로 계산할 수 있습니다

나는 이것을 사용합니다. 사용자가 새 용지 크기를 선택하면 페이지 크기 및 페이지 표시 방법에 따라 페이지를 다시 그려야합니다.

코드는 정상입니다. 사용자가 선택한 용지 크기에 따라 totalpages을 계산하면됩니다. pageWidthpageHeight이 있고 newAttributes.getMinMargins()을 통해 여백을 얻을 수도 있습니다. 필요한 모든 값은 newAttributes입니다.