【问题标题】:Read PDF file and offer it as download with iText阅读 PDF 文件并通过 iText 提供下载
【发布时间】:2012-07-12 00:37:10
【问题描述】:

如何使用 iText 在浏览器中读取本地 PDF 文件并将其作为下载提供? 这是我尝试过的,但文件总是说:

Adobe Reader 无法打开“xxx.pdf”,因为它不是受支持的文件类型或文件已损坏(例如,它是作为电子邮件附件发送的并且未正确解码)。

PdfReader reader = new PdfReader(filename);
byte[] streamBytes = reader.getPageContent(1);

response.setContentType("application/force-download");
response.setCharacterEncoding("UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=" + filename);

BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

bos.write(reader.getPageContent(1));
bos.write(streamBytes);
bos.flush();
bos.close();

我什至测试了 iText 是否将文件识别为 PDF,这是输出:

System.out.println("PDF Version: " + reader.getPdfVersion());
System.out.println("Number of pages: " + reader.getNumberOfPages());
System.out.println("File length: " + reader.getFileLength());
System.out.println("Encrypted? " + reader.isEncrypted());
System.out.println("Rebuilt? " + reader.isRebuilt());

14:52:42,121 INFO  [STDOUT] PDF Version: 4
14:52:42,121 INFO  [STDOUT] Number of pages: 2
14:52:42,121 INFO  [STDOUT] File length: 186637
14:52:42,121 INFO  [STDOUT] Encrypted? false
14:52:42,121 INFO  [STDOUT] Rebuilt? false

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

    内容类型应为“application/pdf”

      response.setContentType("application/pdf");
    

    编辑:你不必使用 PdfReader 因为你没有修改 pdf,你想做这样的事情:

                 FileInputStream baos = new FileInputStream("c:\\temp\\test.pdf");
    
                 response.setHeader("Expires", "0");
                 response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
                 response.setHeader("Pragma", "public");
                 response.setContentType("application/pdf");
                 response.addHeader("Content-Disposition", "attachment; filename=test.pdf");
    
                 OutputStream os = response.getOutputStream();
    
                 byte buffer[] = new byte[8192];
                 int bytesRead;
    
                 while ((bytesRead = baos.read(buffer)) != -1) {
                     os.write(buffer, 0, bytesRead);
                 }
    
                 os.flush();
                 os.close();
    

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多