Печать PDF из JasperReports - PullRequest
       50

Печать PDF из JasperReports

2 голосов
/ 03 ноября 2011

Я новичок в JasperReports и теряюсь в этом. У меня есть веб-приложение в JSF, которое я хочу использовать для печати PDF. Я построил отчет и смог успешно скомпилировать и заполнить его всеми моими параметрами. Тем не менее, я потерял на фактической выходной части. Я хотел бы, чтобы это пошло на принтер в формате PDF. Меня не волнует когда-либо видеть это на экране, идеальным будет прямой доступ к принтеру (с сервера будет идеальным, но с клиентом все будет в порядке, так как мы можем настроить клиентов для печати по мере необходимости (это внутреннее приложение)) .

1 Ответ

4 голосов
/ 03 ноября 2011

Я бы хотел, чтобы это был принтер в формате PDF. Мне все равно, когда я увижу это на экране, прямо к принтеру будет идеально

Вы не можете сделать это с простым HTML / CSS / JS. Поскольку JSF - это просто генератор кода HTML / CSS / JS, он не может творить волшебство для вас. Самое близкое, что вы можете получить, это JavaScript window.print(), но он все равно покажет пользователю настройки принтера и тому подобное (в основном, он делает то же, что и Ctrl+P).

Лучше всего создать апплет , который использует API javax.print , а затем внедрить этот апплет на страницу JSF с помощью тега HTML <applet> или <object>.

Если вы можете жить, видя его прямо на экране и передавая задание на печать самому конечному пользователю, то вы можете отправить файл PDF на экран с помощью JSF следующим образом:

public void sendPdf() throws IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.setResponseContentType("application/pdf");
    externalContext.setResponseHeader("Content-Disposition", "inline; filename=\"filename.pdf\"");
    yourJasperReportsClass.writePdfTo(externalContext.getResponseOutputStream());
    facesContext.responseComplete();
}

Я никогда не работал с JasperReports, поэтому yourJasperReportsClass.writePdfTo() было случайным предположением, но подсказка должна быть достаточно ясной. Вам в основном нужно дать команду написать PDF в тело ответа.


Обновление : согласно комментариям, этот принтер фактически подключен к серверу, а не к клиенту, и вы действительно хотите, чтобы сервер распечатал его на своем принтере. В этом случае просто используйте javax.print API . Внизу этого документа вы можете найти несколько примеров кода. Вот выдержка из релевантности:

Использование API

Типичное приложение, использующее API печати Java, выполняет эти шаги для обработки запроса на печать:

  • Выбирает DocFlavor.
  • Создает набор атрибутов.
  • Находит сервис печати, который может обрабатывать запрос на печать, как указано в DocFlavor и наборе атрибутов.
  • Создает объект Doc, инкапсулирующий DocFlavor и фактические данные печати, которые могут принимать различные формы, включая: файл Postscript, изображение JPEG, URL-адрес или простой текст.
  • Получает задание на печать, представленное DocPrintJob, из службы печати. ​​
  • Вызывает метод печати задания на печать.

Следующий пример кода демонстрирует типичное использование API службы печати Java: поиск принтеров, которые могут печатать пять двусторонних копий документа Postscript на бумаге формата A4, создание задания печати из одной из возвращенных служб печати и вызов печати. ​​

FileInputStream psStream; 

try { 
  psStream = new FileInputStream("file.ps");
} catch (FileNotFoundException ffne) {
} 

if (psStream == null) { 
  return;
}

DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT; 
Doc myDoc = new SimpleDoc(psStream, psInFormat, null); 
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
aset.add(new Copies(5)); 
aset.add(MediaSize.A4); 
aset.add(Sides.DUPLEX); 

PrintService[] services = PrintServiceLookup.lookupPrintServices(psInFormat, aset); > 
if (services.length > 0) { 
  DocPrintJob job = services[0].createPrintJob(); 

  try {
    job.print(myDoc, aset); 
  } catch (PrintException pe) {
  }
} 

Это не имеет значения, если приведенный выше код вызывается управляемым компонентом JSF. Это ведь просто Java. Возможно, вы захотите изменить только DocFlavor и другие настройки.

...