2016-06-03 11 views
0

Ich versuche, PDF-Datei aus Byte-Array, die aus der Datenbank kommt zu erstellen. Der Code läuft gut und erstellen Sie die PDF-Datei, aber ich kann nicht öffnen, die Datei zeigt, dass die Datei beschädigt oder beschädigt ist. Hier zeige ich meinen vollständigen Code, bitte zeigen Sie mir, was ich ändern möchte oder welche Art und Weise richtig ist, um diese Art von Code zu erreichen. Vielen Dank.Create PDF mit Byte-Array aus der Datenbank

TestPDF:

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
public class TestPDF { 

public static void main(String[] args) throws FileNotFoundException { 

    String jdbcClassName="com.ibm.db2.jcc.DB2Driver"; 
    String host="hostname",port="50000",db="dbname",dbuser="user",dbpass="pass"; 
    String url="jdbc:db2://"+host+":"+port+"/"+db; 
    String user=dbuser; 
    String password=dbpass; 

    Connection con = null; 
    InputStream fetchStream = null; 
    try{ 
     //Load class into memory 
     Class.forName(jdbcClassName); 
     //Establish connection 
     con = DriverManager.getConnection(url, user, password); 
    PreparedStatement pstmt = con.prepareStatement("select * from tgpoa01.aud_trail_dtl WHERE AUD_TRAIL_REC_ID = '-9223372036798517556'"); 
    ResultSet rs = pstmt.executeQuery(); 
    if(rs.next()) 
    { 

    fetchStream = rs.getBinaryStream("AUD_TRAIL_MSG_TX"); 

    if(rs.getString("AUD_PRCS_STAGE_CD").equals("CONT")){ 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    byte[] buf = new byte[1024]; 
    try { 
    for (int readNum; (readNum = fetchStream.read(buf)) != -1;) { 
    bos.write(buf, 0, readNum); 
    System.out.println("read " + readNum + " bytes,"); 
    } 
    System.out.println("Byte array is="+bos); 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    } 
    byte[] bytes = bos.toByteArray(); 
    File someFile = new File("d://Output_File.pdf"); 
    try{ 
    FileOutputStream fos = new FileOutputStream(someFile); 
    fos.write(bytes); 
    fos.flush(); 
    fos.close(); 
    }catch(Exception e){ 
    } 

    } 


    } 
    }catch(Exception e){ 
    System.out.println("Exception in getting PDF : "+e); 
    } 


} 
} 
+0

nie ohne Griff Ausnahme abfangen. füge 'e.printStacktrace()' in den catch-Block ein, um zu sehen, ob eine Ausnahme auftritt – Jens

+0

auch wenn ich printStackTrace() hinzufüge kein Fehler kam –

+0

Du hast 3 'catch'in dort. Einer von ihnen schluckt die "Exception" –

Antwort

0

Die for Schleife Sie die bytes aus der DB zu lesen verwenden sieht irgendwie seltsam für mich. Können Sie eine dieser (völlig ungetestet) Alternativen versuchen Sie bitte:

ResultSet.getBinaryStream(...) Verwendung:

if (rs.next()) { 

    if (rs.getString("AUD_PRCS_STAGE_CD").equals("CONT")) { 

     File someFile = new File("d://Output_File.pdf");   
     FileOutputStream fos = new FileOutputStream(someFile); 

     byte[] buffer = new byte[1]; 
     fetchStream = rs.getBinaryStream("AUD_TRAIL_MSG_TX"); 
     while (fetchStream.read(buffer) > 0) { 
      fos.write(buffer); 
     } 
     fos.close();   

    } 

} 

ResultSet.getBlob(...) Verwendung:

if (rs.next()) { 

    if (rs.getString("AUD_PRCS_STAGE_CD").equals("CONT")) { 

     Blob blob = rs.getBlob("AUD_TRAIL_MSG_TX"); 
     byte[] bytes = blob.getBytes(1, (int)blob.length()); 

     File someFile = new File("d://Output_File.pdf");   
     FileOutputStream fos = new FileOutputStream(someFile); 
     fos.write(bytes); 
     fos.flush(); 
     fos.close(); 

    } 

} 
+0

eigentlich AUD_TRAIL_MSG_TX Datentyp in der Datenbank ist Bytes [] das ist warum ich kämpfen –

+0

Das ist interessant. Können Sie die Datenbankspaltedefinitionen abrufen? Etwas in der Art von 'DESC tgpoa01.aud_trail_dtl;'. Es würde helfen, das Ergebnis in Ihre ursprüngliche Frage zu bringen, wenn Sie können. Auch, welche Art von dtabase ist es (MySQL, Oracle, ...)? –

+0

es ist eine DB2-Datenbank, ich muss den Byte-Array-Wert drucken. Aber ich bin mir nicht sicher, ob das Bytearray gedruckt werden soll, es muss in einen anderen Datentyp konvertiert werden oder nicht. –