PDF Java print: задание отправлено в очередь заданий принтера, но ничего не печатается

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

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

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());
}

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

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;
}

Надеюсь это поможет.

Другие вопросы по тегам