2012-07-11 160 views
0

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

Adob​​e 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 

回答

1

内容类型应该是 “应用程序/ 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(); 
+0

你说得对,但它没有解决任何问题。 – doonot 2012-07-11 13:08:19