Come posso pubblicare un PDF su un browser senza archiviare un file sul lato server?

Ho due metodi. Uno che genera un PDF sul lato server e un altro che scarica il PDF sul lato client.

Come posso fare questo senza memorizzarlo sul lato server e consentire al lato client di scaricare direttamente questo.

I seguenti sono i due metodi:

public void downloadPDF(HttpServletRequest request, HttpServletResponse response) throws IOException{ response.setContentType("application/pdf"); response.setHeader("Content-disposition","attachment;filename="+ "testPDF.pdf"); FileInputStream fis = null; DataOutputStream os = null; try { File f = new File("C://New folder//itext3.pdf"); response.setHeader("Content-Length",String.valueOf(f.length())); fis = new FileInputStream(f); os = new DataOutputStream(response.getOutputStream()); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) >= 0) { os.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { fis.close(); os.flush(); os.close(); } response.setHeader("X-Frame-Options", "SAMEORIGIN"); } 

E:

 public Document generatePDF() { Document doc = new Document(); try { File file = new File("C://New folder//itext_Test2.pdf"); FileOutputStream pdfFileout = new FileOutputStream(file); PdfWriter.getInstance(doc, pdfFileout); doc.addAuthor("TestABC"); doc.addTitle("Aircraft Details"); doc.open(); Anchor anchor = new Anchor("Aircraft Report"); anchor.setName("Aircraft Report"); Chapter catPart = new Chapter(new Paragraph(anchor), 1); Paragraph para1 = new Paragraph(); Section subCatPart = catPart.addSection(para1); para1.add("This is paragraph 1"); Paragraph para2 = new Paragraph(); para2.add("This is paragraph 2"); doc.add(catPart); doc.close(); } catch (Exception e) { e.printStackTrace(); } return doc; } 

Le persone che consigliano di utilizzare response.getOutputStream() invece di creare un FileOutputStream hanno ragione. Vedi ad esempio l’ Hello Servlet del capitolo 9 del mio libro:

 public class Hello extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/pdf"); try { // step 1 Document document = new Document(); // step 2 PdfWriter.getInstance(document, response.getOutputStream()); // step 3 document.open(); // step 4 document.add(new Paragraph("Hello World")); document.add(new Paragraph(new Date().toString())); // step 5 document.close(); } catch (DocumentException de) { throw new IOException(de.getMessage()); } } } 

Tuttavia, alcuni browser presentano problemi quando si inviano byte direttamente in questo modo. È più sicuro creare il file in memoria utilizzando ByteArrayOutputStream e dire al browser quanti byte può aspettarsi nell’intestazione del contenuto:

 public class PdfServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // Get the text that will be added to the PDF String text = request.getParameter("text"); if (text == null || text.trim().length() == 0) { text = "You didn't enter any text."; } // step 1 Document document = new Document(); // step 2 ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter.getInstance(document, baos); // step 3 document.open(); // step 4 document.add(new Paragraph(String.format( "You have submitted the following text using the %s method:", request.getMethod()))); document.add(new Paragraph(text)); // step 5 document.close(); // setting some response headers response.setHeader("Expires", "0"); response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); response.setHeader("Pragma", "public"); // setting the content type response.setContentType("application/pdf"); // the contentlength response.setContentLength(baos.size()); // write ByteArrayOutputStream to the ServletOutputStream OutputStream os = response.getOutputStream(); baos.writeTo(os); os.flush(); os.close(); } catch(DocumentException e) { throw new IOException(e.getMessage()); } } } 

Per il codice sorgente completo, vedere PdfServlet . Puoi provare il codice qui: http://demo.itextsupport.com/book/

Stai creando un FileOutputStream per generare pdf. Ma quello che puoi fare è usare lo stream che è presente in HttpServletResponse sul lato server e scrivere direttamente il file su di esso.

È ansible ricevere un OutputStream nel metodo generatePDF . Se si passa il response.getOutputStream() al metodo di generazione, il PDF verrà scritto direttamente nella risposta.

Basta chiamare questo metodo appropriatamente da downloadPDF() ; per esempio:

 generatePDF(response.getOutputStream()); 

che chiama questo metodo:

 public void generatePDF(OutputStream pdfOutputStream) { Document doc = new Document(); try { PdfWriter.getInstance(doc, pdfOutputStream); doc.addAuthor("TestABC"); doc.addTitle("Aircraft Details"); doc.open(); Anchor anchor = new Anchor("Aircraft Report"); anchor.setName("Aircraft Report"); Chapter catPart = new Chapter(new Paragraph(anchor), 1); Paragraph para1 = new Paragraph(); Section subCatPart = catPart.addSection(para1); para1.add("This is paragraph 1"); Paragraph para2 = new Paragraph(); para2.add("This is paragraph 2"); doc.add(catPart); doc.close(); } catch (Exception e) { e.printStackTrace(); } }