如何在不在服务器端存储文件的情况下将PDF提供给浏览器?

我有两种方法。 一个在服务器端生成PDF,另一个在客户端下载PDF。

如何在不将其存储在服务器端并允许客户端直接下载它的情况下执行此操作。

以下是两种方法:

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"); } 

和:

 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; } 

建议您使用response.getOutputStream()而不是创建FileOutputStream是正确的。 例如,请参阅本书第9章中的Hello Servlet:

 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()); } } } 

但是,当您直接发送字节时,某些浏览器会遇到问题。 使用ByteArrayOutputStream在内存中创建文件更安全,并告诉浏览器在内容标题中可以预期多少字节:

 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()); } } } 

有关完整源代码,请参阅PdfServlet 。 你可以在这里试试代码: http : //demo.itextsupport.com/book/

您正在创建FileOutputStream以生成pdf。 但是你可以做的是在服务器端方法中使用HttpServletResponse中存在的流并直接将文件写入它。

您可以在generatePDF方法中接收OutputStream 。 如果将response.getOutputStream()传递给generate方法,则PDF将直接写入响应。

只需从downloadPDF()适当地调用此方法; 例如:

 generatePDF(response.getOutputStream()); 

调用此方法:

 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(); } }