2013-05-23 4 views
2

Я использую следующий метод для печати pdf-файлов в программе, которую я использую. Он работает, но я должен вызывать метод каждый раз, когда я хочу, чтобы одна страница печаталась. Поэтому, если я хочу напечатать один и тот же документ пять раз, весь этот метод должен выполняться пять раз. Мой вопрос в том, есть ли способ добавить несколько документов в PrinterJob, чтобы этот метод можно было назвать ровно один раз, чтобы распечатать то, что мне нужно?Добавление нескольких документов к PrinterJob

public static void printPdf(File thePdf) 
{ 
    File f = thePdf; 
    RandomAccessFile fis = null; 
    FileChannel fc = null; 
    ByteBuffer bb = null; 
    try 
    { 
     PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 

     fis = new RandomAccessFile(f, "rw"); 
     fc = fis.getChannel(); 
     bb = ByteBuffer.allocate((int) fc.size()); 
     fc.read(bb); 
     PDFFile pdfFile = new PDFFile(bb); 
     PDFPrintPage pages = new PDFPrintPage(pdfFile); 
     PrinterJob pjob = PrinterJob.getPrinterJob(); 
     pjob.setPrintService(service); 

     PageFormat pf = PrinterJob.getPrinterJob().defaultPage(); 

     pf.setOrientation(PageFormat.PORTRAIT); 

     Paper paper = new Paper(); 

     paper.setImageableArea(0, 0, paper.getWidth() * 2, paper.getHeight()); 

     pf.setPaper(paper); 

     pjob.setJobName(f.getName()); 

     Book book = new Book(); 
     book.append(pages, pf, pdfFile.getNumPages()); 
     pjob.setPageable(book); 
     pjob.print(); 

    } 
    catch (IOException|PrinterException e) 
    { 
     ShowErrors.show_errors("Printing exception: "+e.toString()); 
    } 
    finally 
    { 
     try 
     { 
      if (fc != null) 
       fc.close(); 
      if (fis != null) 
       fis.close(); 
     } 
     catch (IOException e) 
     { 
      System.out.println("Exception closing IO channel: "+e.toString()); 
     } 

     if (bb != null) 
     { 
      bb.clear(); 
     } 
    } 
} 

Было бы идеально, если бы я мог передать этот метод массив объектов File и добавить каждую из них pjob (я предполагаю, что где бы вы добавить их, если это возможно). Я просмотрел документацию, и это, честно говоря, довольно запутанно для меня. Если бы кто-нибудь мог указать мне в правильном направлении, я был бы признателен. Благодарю.

ответ

0

Поскольку ваш код не работает, вот мое лучшее предположение о печати нескольких файлов с несколькими копиями.

public void printPdf(List<File> pdfFiles, int copies) { 
    PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 
    RandomAccessFile fis = null; 
    FileChannel fc = null; 
    ByteBuffer bb = null; 
    try { 

     for (int i = 0; i < pdfFiles.size(); i++) { 
      File f = pdfFiles.get(i); 
      fis = new RandomAccessFile(f, "rw"); 
      fc = fis.getChannel(); 
      bb = ByteBuffer.allocate((int) fc.size()); 
      fc.read(bb); 

      for (int j = 0; j < copies; j++) { 
       PrinterJob pjob = PrinterJob.getPrinterJob(); 
       pjob.setPrintService(service); 

       PageFormat pf = PrinterJob.getPrinterJob().defaultPage(); 
       pf.setOrientation(PageFormat.PORTRAIT); 

       Paper paper = new Paper(); 
       paper.setImageableArea(0, 0, paper.getWidth() * 2, 
         paper.getHeight()); 
       pf.setPaper(paper); 

       PDFFile pdfFile = new PDFFile(bb); 
       PDFPrintPage pages = new PDFPrintPage(pdfFile); 
       pjob.setJobName(f.getName()); 

       Book book = new Book(); 
       book.append(pages, pf, pdfFile.getNumPages()); 
       pjob.setPageable(book); 
       pjob.print(); 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (PrinterException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fc != null) 
       fc.close(); 
      if (fis != null) 
       fis.close(); 
     } catch (IOException e) { 
      System.out.println("Exception closing IO channel: " 
        + e.toString()); 
     } 

     if (bb != null) { 
      bb.clear(); 
     } 
    } 
} 
Смежные вопросы