2016-08-07 4 views
1

Я пытаюсь распечатать pdf прямо из потока в vaadin 7 с помощью Apache FOP + xsl. На данный момент я могу успешно создать новый XML-документ и восстановить pdf-файл с помощью xsl fo. Я сохраняю файл на сервере, и все выглядит хорошо.Как распечатать pdf-файл из потока в vaadin 7?

Моя проблема заключается в том, что сохранить файл на сервере невозможно, поэтому мне нужно его прочитать на какой-то bytearray, а затем открыть его, когда пользователь нажимает кнопку «Печать».

out = new java.io.FileOutputStream(
     "/testPrint.pdf"); 

try { 
    // Construct fop with desired output format 
    Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); 

    // XSL 
    TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer = 
      factory.newTransformer(new StreamSource("printTemplate.xsl")); 

    Result res = new SAXResult(fop.getDefaultHandler()); 

    //xml->xsl-fo-->pdf 
    transformer.transform(xml, res); 
} finally { 
    out.close(); 
} 

Когда пользователь нажимает кнопку печати, сгенерированный pdf-документ выглядит хорошо после этого, когда я проверяю его с сервера.

print.addClickListener(new ClickListener() { 

@Override 
public void buttonClick(ClickEvent event) 
{ 
    PdfComponent pdf = new PdfComponent(lang, bookingDto); 

    try { 
     DOMSource xml = pdf.getXMLSource(bookingDto, lang); 
     pdf.convertToPDF(lang,xml); 
     } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
}); 

ВОПРОС

Как я могу получить документ PDF в поток и как я могу получить его автоматически открываться в браузере, когда пользователь нажимает на кнопку печати в Vaadin 7 приложения без сохранения файла сервер?

ответ

1

Загрузка файлов в Vaadin работает, как описано here. Резюме:

Button downloadButton = new Button("Download image"); 
StreamResource myResource = createResource(); 
FileDownloader fileDownloader = new FileDownloader(myResource); 
fileDownloader.extend(downloadButton); 

Тогда ваш StreamResource обеспечивает InputStream, содержащий данные файла. Таким образом, вам не нужно сохранять файл на сервере. Что касается печати, я не знаю, можно ли даже инструктировать браузер напрямую открыть диалоговое окно печати.

+0

Спасибо за ваш комментарий! Я получил ByteArrayOutputStream от трансформатора Apache FOP. есть ли способ получить StreamResource каким-то образом из выходного потока? Я получил поток, когда пользователь нажимает кнопку печати. – Sami

+0

Посмотрите на связанную страницу wiki, пример кода: 'new ByteArrayInputStream (bos.toByteArray())' где 'bos' является' ByteArrayOutputStream' –

+0

Спасибо Steffen. Теперь я получил его отчасти. Пользователь должен дважды щелкнуть кнопку, чтобы загрузить pdf-файл. – Sami

0

однажды я разработал что-то, основываясь на этом, и он последовал за шагами ниже:

  • Pass входные данные в виде XML с переднего конца к стороне сервера (вы можете использовать AJAX).
  • На стороне сервера используйте fop для создания своего pdf-файла, сохраните файл pdf где-нибудь (возможно, в папке).
  • Сделайте другой звонок с лицевой стороны, чтобы получить файл PDF и отобразить его. Не уверен, если это, как написано в Vaadin, но это примерно так:

    pdffile = "\\path\\"+pdfname+".pdf" 
    file = new File(pdffile) 
    response.setContentType("application/pdf") 
    response.setHeader("Content-disposition" , "inline; filename=${file.getName()}") 
    response.outputStream << file.newInputStream() 
    

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

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