У меня есть требование распечатать PDF файлы двумя разными способами - через веб-страницу, где пользователь увидит предварительный просмотр печати и выберет принтер и распечатает его. Второй способ - автоматизировать печать, просто нажав кнопку, PDF следует отправить на принтер.
Первый способ печати через веб-страницу работает нормально, но не второй. Принтер по умолчанию успешно извлекается для автоматической печати, но не печатается, и я также не получаю никаких ошибок. Ниже приведен мой анализ:
- Сначала я думал, что
DocFlavor
не поддерживается. Затем я перечислил вниз поддерживаемыйDocFlavor
этого принтера, и один из них был application/octet-stream, который равенDocFlavor.INPUT_STREAM.AUTOSENSE
. Таким образом, вкус поддерживается принтером. - Затем я добавил
PrintJobListener
, чтобы проверить, выполнено ли задание на печать не смогли. Когда я добавил слушателя к printJob, он печатаетNo_More_Events
иDATA_TRANSFER_COMPLETE
, которые должны быть напечатаныJOB_COMPLETE
, если задание выполнено успешно. - Последний шаг - отладка кода Java. Когда я выполнил линию
job.print()
, он переходит в методWin32PrintJob.print()
. Я сделал F6 до выполните каждую строку, чтобы увидеть, что она делает. Я сравнил его с кодом в GrepCode, поскольку исходный код не был загружен в eclipse. Это все идет хорошо, и я не вижу никакой ошибки. Единственное, что он сделал не входит в этот блок, где он проверяетmDestination
потому что я не предоставил его, он не прошел.
См. код ниже:
if (mDestination != null) { // if destination attribute is set
try {
FileOutputStream fos = new FileOutputStream(mDestination);
byte [] buffer = new byte[1024];
int cread;
while ((cread = instream.read(buffer, 0, buffer.length)) >= 0) {
fos.write(buffer, 0, cread);
}
fos.flush();
fos.close();
} catch (FileNotFoundException fnfe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(fnfe.toString());
} catch (IOException ioe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(ioe.toString());
}
notifyEvent(PrintJobEvent.DATA_TRANSFER_COMPLETE);
notifyEvent(PrintJobEvent.JOB_COMPLETE);
service.wakeNotifier();
return;
}
Это единственное место, где указано JOB_COMPLETE. Я думаю, что этот блок должен записывать в файл, который мне не нужен.
Я думаю, что фактическая печать выполняется в следующей строке тем же методом Win32PrintJob.print().
private native boolean More ...printRawData(byte[] data, int count);
Но этот метод является родным, поэтому я не знаю, что происходит внутри этого.
Пожалуйста, дайте мне знать, почему я не могу распечатать PDF.
EDIT:
Прикрепленный код для печати файла:
PrintService pss = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob job = pss.createPrintJob();
DocAttributeSet das = new HashDocAttributeSet();
Doc document;
try {
document = new SimpleDoc(new FileInputStream(new File(fileName)), DocFlavor.INPUT_STREAM.AUTOSENSE, das);
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
job.addPrintJobListener(new PrintJobWatcher());
job.print(document, pras);
}
ПРИМЕЧАНИЕ. Я пробовал разные варианты, такие как PDF, PCL. Ничего не работает, и я получаю ошибку времени выполнения, которая не поддерживается.