2016-08-18 33 views
0

我有一個包含PDF數據的數據庫。我已經成功地調用了這些數據,並使用Java將它寫到我的硬盤上的PDF文件中。現在,我需要將這些數據發送給Web客戶端,以便將其嵌入到HTML中。我在這個主題上發現了很多不同的帖子,實際上有很多不同的帖子,但它們都在這個主題上有微妙的變化(不同的編碼語言,試圖在新窗口中打開pdf,不同的數據類型),這讓我仍然困惑不解。從Java Sevlet嵌入PDF數據

這是我的Java代碼:

package fullView; 

import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


@WebServlet(name = "GetDocuments", urlPatterns = {"/GetDocuments"}) 
public class GetDocuments extends HttpServlet { 


@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    Connection conn = null; 
    ResultSet rs = null; 
    PreparedStatement prst = null; 

    String connUrl = "Connection data omitted"; 


    String sql = "select * from Table where type LIKE 'application/pdf%' and id = '5'"; 


    try{ 
     Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
     conn = DriverManager.getConnection(connUrl); 
     prst = conn.prepareStatement(sql); 

     rs = prst.executeQuery(); 
     File[] files; 
     while(rs.next()){ 
      byte[] arr = rs.getBytes("data"); 
      response.setHeader("Content-Type", "application/pdf"); 
      response.setHeader("Content-Length", String.valueOf(arr.length)); 
      response.setHeader("Content-Disposition", "inline; filename=\"something.pdf\""); 
      response.getOutputStream().write(arr); 
      response.getOutputStream().close(); 
     } 
    }catch(Exception e){ 
     String error = e.toString(); 
     error = "The Error is: " + error; 
     error = " " + error; 

    } 

} 


public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
       + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 

有一個名爲「docHolder」我要嵌入到PDF格。這是幾十種我試圖讓這個WORL

function embedFile(){ 
      $.get("GetDocuments?ER=ER1471378280115", function(responseText){      
       responseText = b64EncodeUnicode(responseText); 
       var String = "<object data='data:application/pdf;base64," + responseText + "' type='application/pdf' width='700px%' height='100%'></object>";      
       $("#docHolder").append(String); 
      }); 
     } 

我取回「responseText的」是「%PDF1.4」字符串類型中的最新產品。此代碼確實呈現PDF,但是它有許多空白頁面。我通過「寫入磁盤」方法確認數據不僅包含空白頁。

+0

你試過PDF.js的依賴? https://mozilla.github.io/pdf.js/ –

+0

我在這拍了一下簡要的進一步期待的意圖,但我的初步印象是,它創建了一個網頁,這是完全是一個PDF,而不是嵌入一個。我會採取更長的期待,看看我是否可以用它來嵌入。 –

回答

0

你是否嘗試過在服務器上設置你的內容類型爲application/pdf。

response.setHeader("Content-Type", "application/pdf"); 

代替

response.setHeader("Content-Type", "Your staffs content type"); 

我不知道你在JavaScript中使用的框架,但它可能是他們使用的內容類型的HTTP頭,以確定該文件的類型。

我創建了一個簡單的測試案例,以幫助您

@Test 
public void test_servlet() throws ServletException, IOException, URISyntaxException{ 

    GetDocuments servlet = new GetDocuments(); 
    HttpServletRequest request = Mockito.mock(HttpServletRequest.class); 
    HttpServletResponse response = Mockito.mock(HttpServletResponse.class); 

    ServletOutputStream os = new ServletOutputStream() { 

     @Override 
     public void write(byte[] b) throws IOException { 
      System.out.println("Inside my stream"); 
      Files.write(Paths.get("MyFile.pdf"), b, StandardOpenOption.CREATE_NEW); 

     } 

     @Override 
     public void write(int b) throws IOException { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void setWriteListener(WriteListener arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public boolean isReady() { 
      return true; 
     } 
    }; 


    Mockito.when(response.getOutputStream()).thenReturn(os); 


    servlet.doGet(request, response); 

} 

運行此,您的數據將裏面MyFile.pdf寫,如果MyFile.pdf看起來也與空白頁面,這意味着它是一個數據問題。

下面是我用

<dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/org.mockito/mockito-all --> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.10.19</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
    </dependency> 
+0

我不能相信我錯過了。讓我們看看是否有幫助。 –

+0

不幸的是沒有解決任何問題。我在最後添加了更新。我一直在收回只有多個空白頁面的PDF。頁數是準確的,但沒有內容。 –

+0

你確定你的查詢返回正確的數據嗎?如果您在servlet外部執行代碼並寫入文件,它是否工作? –