2016-09-10 5 views
0

У меня проблема, мой код, который преобразует PDF в печатный формат, который можно распечатать, блокирует мой файл PDF.Java Itext PDF печать, печать файлов остается заблокирована Java

Мой код:

public class PDFPrinter { 

public PDFPrinter(File file) { 
    try { 
     FileInputStream fis = new FileInputStream(file); 
     FileChannel fc = fis.getChannel(); 
     ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()); 
     fis.close(); 
     fc.close(); 
     PDFFile pdfFile = new PDFFile(bb); // Create PDF Print Page 
     PDFPrintPage pages = new PDFPrintPage(pdfFile); 

     // Create Print Job 
     PrinterJob pjob = PrinterJob.getPrinterJob(); 
     PageFormat pf = PrinterJob.getPrinterJob().defaultPage(); 
     Paper a4paper = new Paper(); 
     double paperWidth = 8.26; 
     double paperHeight = 11.69; 
     a4paper.setSize(paperWidth * 72.0, paperHeight * 72.0); 

     /* 
     * set the margins respectively the imageable area 
     */ 
     double leftMargin = 0.3; 
     double rightMargin = 0.3; 
     double topMargin = 0.5; 
     double bottomMargin = 0.5; 

     a4paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0, 
       (paperWidth - leftMargin - rightMargin) * 72.0, 
       (paperHeight - topMargin - bottomMargin) * 72.0); 
     pf.setPaper(a4paper); 

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

     // Send print job to default printer 
     if (pjob.printDialog()) { 
      pjob.print(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (PrinterException e) { 
     JOptionPane.showMessageDialog(null, "Printing Error: " 
       + e.getMessage(), "Print Aborted", 
       JOptionPane.ERROR_MESSAGE); 
     e.printStackTrace(); 
    } 
} 

class PDFPrintPage implements Printable { 
    private PDFFile file; 

    PDFPrintPage(PDFFile file) { 
     this.file = file; 
    } 

    public int print(Graphics g, PageFormat format, int index) 
      throws PrinterException { 
     int pagenum = index + 1; 

     // don't bother if the page number is out of range. 
     if ((pagenum >= 1) && (pagenum <= file.getNumPages())) { 
      // fit the PDFPage into the printing area 
      Graphics2D g2 = (Graphics2D) g; 
      PDFPage page = file.getPage(pagenum); 
      double pwidth = format.getImageableWidth(); 
      double pheight = format.getImageableHeight(); 

      double aspect = page.getAspectRatio(); 
      double paperaspect = pwidth/pheight; 

      Rectangle imgbounds; 

      if (aspect > paperaspect) { 
       // paper is too tall/pdfpage is too wide 
       int height = (int) (pwidth/aspect); 
       imgbounds = new Rectangle(
         (int) format.getImageableX(), 
         (int) (format.getImageableY() + ((pheight - height)/2)), 
         (int) pwidth, height); 
      } else { 
       // paper is too wide/pdfpage is too tall 
       int width = (int) (pheight * aspect); 
       imgbounds = new Rectangle(
         (int) (format.getImageableX() + ((pwidth - width)/2)), 
         (int) format.getImageableY(), width, (int) pheight); 
      } 

      // render the page 
      PDFRenderer pgs = new PDFRenderer(page, g2, imgbounds, null, 
        null); 
      try { 
       page.waitForFinish(); 
       pgs.run(); 
      } catch (InterruptedException ie) { 
      } 

      return PAGE_EXISTS; 
     } else { 
      return NO_SUCH_PAGE; 
     } 
    } 
} 
} 

Я называю это с:

new PDFPrinter(file); 

Все работает отлично, но после того, как я начал печатать PDF-файл заблокирован Java. Что не так?? Когда я перезапускаю Java, он работает снова, но только один раз, после чего он снова блокируется.

+0

Вы уверены, что это вопрос о IText ?? ? –

+0

Не о нем, но у него есть отношение к нему –

+0

Я вижу, что вы удалили тег iText. Спасибо. FYI: все SO-вопросы, помеченные как «itext», отображаются в канале на Slack iText (наш инструмент внутренней коммуникации). –

ответ

0

Я нашел другое решение ...

Для всех:

public static void printPdf (String filePath, String jobName) throws IOException, PrinterException { 

    FileInputStream fileInputStream = new FileInputStream(filePath); 
    byte[] pdfContent = new byte[fileInputStream.available()]; 
    fileInputStream.read(pdfContent, 0, fileInputStream.available()); 
    ByteBuffer buffer = ByteBuffer.wrap(pdfContent); 

    final PDFFile pdfFile1 = new PDFFile(buffer); 
    pdf_print_engine pages1 = new pdf_print_engine(pdfFile1); 
    PrinterJob pjob = PrinterJob.getPrinterJob(); 
    PageFormat pfDefault = PrinterJob.getPrinterJob().defaultPage(); 
    Paper defaultPaper = new Paper(); 
    defaultPaper.setImageableArea(0, 0, defaultPaper.getWidth(), defaultPaper.getHeight()); 
    pfDefault.setPaper(defaultPaper); 
    pjob.setJobName("Test"); 
    if (pjob.printDialog()) { 
     // validate the page against the chosen printer to correct 
     // paper settings and margins 
     pfDefault = pjob.validatePage(pfDefault); 
     Book book = new Book(); 

     book.append(pages1, pfDefault, pdfFile1.getNumPages()); 
     pjob.setPageable(book); 

     try { 
      pjob.print(); 
     } catch (PrinterException exc) { 
      System.out.println(exc); 
     } 
    } 

Веселитесь с Кодексом

Tim

Смежные вопросы