У меня есть требование распечатать PDF-файлы двумя способами: через веб-страницу, где пользователь увидит предварительный просмотр печати и выберет принтер и распечатает его. Второй способ - автоматизировать печать, просто нажав кнопку, PDF следует отправить на принтер.Автоматическая печать не работает в Java
Первый способ печати через веб-страницу работает нормально, но не второй способ. Принтер по умолчанию успешно извлекается для автоматической печати, но не печатается, и я также не получаю никаких ошибок. Ниже приводятся мой анализ:
- Первоначально, я думал, что
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. Ничего не работает, и я получаю ошибку времени выполнения, которая не поддерживается.
Не могли бы вы обновить свой вопрос кодом, который вы пишете для печати файла? Как вы упомянули выше, код используется для записи в файл. – Parth
Я думаю, что проблема в том, что вам нужно ** визуализировать ** pdf в первую очередь, вы не можете распечатать его напрямую, около 10 лет назад я сделал это с помощью функции автоматической печати acrobat cli ... ставка теперь есть альтернативы. – maraca
@maraca: Я могу распечатать его на принтере Xerox, но не с Fuji. – Anand