2011-05-11 50 views
0

下面的代码抓起一个PDF文件,并显示在浏览器中的PDF文件。问题上的Java Servlet来打开一个利用iText

import java.io.ByteArrayOutputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 

import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.lowagie.text.Document; 
import com.lowagie.text.DocumentException; 
import com.lowagie.text.pdf.PdfReader; 
import com.lowagie.text.pdf.PdfStamper; 
import com.lowagie.text.pdf.PdfStream; 
import com.lowagie.text.pdf.PdfWriter; 

public class WelcomeServlet extends HttpServlet { 

    private static final String DOCUMENT_LOCATION = "H:\\testPDF.pdf"; // a test pdf on my PC 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
    } 


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PdfReader reader = new PdfReader(DOCUMENT_LOCATION); 
     PdfStamper stamper = null; 
     try { 
      stamper = new PdfStamper(reader, baos); 
     } catch (DocumentException e) { 
      e.printStackTrace(); 
     } 
     try { 
      stamper.close(); 
     } catch (DocumentException e) { 
      System.out.println("Why is it making me do this?"); 
      e.printStackTrace(); 
     } 

     // set some response headers 
     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.setContentLength(baos.size()); 

     OutputStream os = response.getOutputStream(); 
     baos.writeTo(os); 
     os.flush(); 
     os.close(); 

    } 
} 

如果将其更改为此代码,则不会返回该文件。唯一的区别是处理PdfStamper的行被删除。

import java.io.ByteArrayOutputStream; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.io.OutputStream; 
    import java.io.PrintWriter; 

    import javax.servlet.ServletConfig; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    import com.lowagie.text.Document; 
    import com.lowagie.text.DocumentException; 
    import com.lowagie.text.pdf.PdfReader; 
    import com.lowagie.text.pdf.PdfStamper; 
    import com.lowagie.text.pdf.PdfStream; 
    import com.lowagie.text.pdf.PdfWriter; 

    public class WelcomeServlet extends HttpServlet { 

     private static final String DOCUMENT_LOCATION = "H:\\testPDF.pdf"; // a test pdf on my PC 

     @Override 
     public void init(ServletConfig config) throws ServletException { 
      super.init(config); 
     } 


     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      PdfReader reader = new PdfReader(DOCUMENT_LOCATION); 

      // set some response headers 
      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.setContentLength(baos.size()); 

      OutputStream os = response.getOutputStream(); 
      baos.writeTo(os); 
      os.flush(); 
      os.close(); 

     } 
    } 

为什么这只适用于PdfStamper?我不想做任何加盖,我只想在浏览器中显示PDF。有什么我失踪,基本上取代了PDF文件在iText的地方?

回答

3

当您使用PdfStamper它是从磁盘读取文件中的数据并将其写入baos。当你删除PdfStamperbaos永远不会被写入。所以当然,baos是空的,所以从不实际返回任何东西。

编辑:

private static void copy(InputStream is, OutputStream os) throws IOException 
{ 
    byte buffer[] = new byte[8192]; 
    int bytesRead, i; 

    while ((bytesRead = is.read(buffer)) != -1) { 
     os.write(buffer, 0, bytesRead); 
    } 
} 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

      FileInputStream baos = new FileInputStream(DOCUMENT_LOCATION); 

      // set some response headers 
      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.setContentLength(new File(DOCUMENT_LOCATION).length()); 

      OutputStream os = response.getOutputStream(); 
      copy(baos, os); 
      os.flush(); 
      os.close(); 

     } 
    } 
2

您没有使用在第二个例子中,读者。我不熟悉PdfStamper,但我猜它使用的阅读器,因此你的文件的内容将在BAOS,但不是在第二种情况下。

2

如果PDF文件已经存在,那么你不必使用方法:要真正做到这一点(的PdfReader如果你想修改PDF只需要) iText的。您只需从该文件读取数据并将其写入OutputStream的响应中。

下面是一些代码

public class WelcomeServlet extends HttpServlet { 

    private static final String DOCUMENT_LOCATION = "H:\\testPDF.pdf"; // a test pdf on my PC 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
    } 


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     // set some response headers 
     response.setHeader("Expires", "0"); 
     response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
     response.setHeader("Pragma", "public"); 
     response.setContentType("application/pdf"); 

     InputStream in = new FileInputStream(DOCUMENT_LOCATION); 
     OutputStream out = response.getOutputStream(); 

     // Copy the bits from instream to outstream 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 
     in.close(); 

    } 
} 
+0

是否有必要位从河道内复制到outstream?这是PdfStamper在幕后做的事情吗? – Catfish 2011-05-11 18:28:05

+0

PdfStamper的目的是其他然后复制数据,最终你的代码拷贝文件,但它更多的那么。恕我直言,它不好(性能)使用PdfStamper复制一个流到另一个。 – user179437 2011-05-11 18:38:29