2016-04-21 6 views
2

Я пытаюсь распечатать документ PDF.
Я вижу работу в очереди принтера, а затем вижу, что она исчезает, например, если принтер закончил работу.PDF Печать в формате Java: задание отправлено в очередь заданий на печать, но ничего не печатает

Но проблема в том, что ничего не печатает. Я не могу понять, что не так в моем коде.

PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null,null); 
PrintService service = null; 
for (String imprimante : listImprimantes){ 
    for(PrintService printService : printServices) { 
     Attribute[] attrs = printService.getAttributes().toArray(); 
     for (int j=0; j<attrs.length; j++) { 
      String attrName = attrs[j].getName(); 
      String attrValue = attrs[j].toString(); 
      if (attrName.equals("printer-info")){ 
       if (attrValue.equals(imprimante)){ 
        service = printService; 
        DocFlavor[] flavors = service.getSupportedDocFlavors(); 
        break; 
       } 
      } 
     } 
    } 
} 
InputStream fi = new ByteArrayInputStream(baos.toByteArray()); 

DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
DocPrintJob printJob = service.createPrintJob(); 
Doc doc = new SimpleDoc(fi, flavor, null); 
try { 
    if (doc != null) { 
     printJob.print(doc, null); 
    } 
} 
catch (PrintException e1) { 
    log.debug(e1.getMessage()); 
} 

Если кто-то может помочь мне в этом ...

+0

Вы когда-нибудь это выясняли? У меня такая же проблема ... –

+0

Нет. проблема все еще продолжается – user1260928

ответ

1

Я знаю, что это немного поздно, чтобы ответить, но так как у меня была такая же проблема, я думаю, что это может помочь другим опубликовать мое решение.

Я столкнулся с этой проблемой в Windows (7), но не в Linux (Fedora), поэтому первым моим действием было проверить настройку драйверов.

Затем я увидел, что PDF-файлы не являются собственными, обработанные многими принтерами. Это принято, но ничего не печатается. Из этого можно выбрать несколько решений:

  1. Преобразование PDF в PS или что-то в этом роде перед отправкой его на принтер.
  2. Используйте стороннюю библиотеку, например Apache PdfBox (текущая версия 2.0.2).

Я выбрал решение 2, и оно работает как шарм. Самое приятное в том, что он также использует PrintService с атрибутами, поэтому вы можете обрабатывать страницы, лотки для принтера и множество опций.

Вот часть моего кода:

private boolean print(PrintService printService, InputStream inputStream, PrintRequestAttributeSet attributes) 
    throws PrintException { 

    try { 
     PDDocument pdf = PDDocument.load(inputStream); 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPrintService(printService); 
     job.setPageable(new PDFPageable(pdf)); 
     job.print(attributes); 
     pdf.close(); 
    } catch (PrinterException e) { 
     logger.error("Error when printing PDF file using the printer {}", printService.getName(), e); 
     throw new PrintException("Printer exception", e); 
    } catch (IOException e) { 
     logger.error("Error when loading PDF from input stream", e); 
     throw new PrintException("Input exception", e); 
    } 
    return true; 
} 

Надеется, что это помогает.

+0

Не забудьте закрыть свой объект PDDocument. Пожалуйста, также укажите версию PDFBox, которую вы используете. (надеюсь, 2.0.2) –

+0

спасибо! Я попробую это. – user1260928

+0

@TilmanHausherr хорошие идеи, спасибо, ответ отредактирован. – teemoo

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