2011-05-11 40 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