2016-06-03 6 views
0

Я пытаюсь создать PDF-файл из массива byte, который поступает из базы данных. Код работает нормально и создает файл PDF, но я не могу открыть файл, который показывает, что файл поврежден или поврежден. Здесь я показываю свой полный код, пожалуйста, укажите, что я хочу изменить или какой путь верен для этого типа кода. Благодарю.Создать PDF, используя массив байтов из базы данных

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

никогда не поймать исключение без обрабатывать его. добавьте 'e.printStacktrace()' внутрь блока catch, чтобы узнать, произошло ли исключение – Jens

+0

, даже если я добавлю printStackTrace(), ошибка не была –

+0

У вас есть 3 'catch'in там. Один из них проглатывает «Исключение» –

ответ

0

Петля for вы используете для чтения bytes из БД выглядит рода странно для меня. Вы можете попробовать один из них (совершенно непроверенные) альтернативы пожалуйста:

Использование ResultSet.getBinaryStream(...):

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(...):

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

фактически AUD_TRAIL_MSG_TX datatype в базе данных - это байты [], вот почему я боюсь –

+0

Это интересно. Можете ли вы получить определения столбцов базы данных? Что-то в строках 'DESC tgpoa01.aud_trail_dtl;'. Это поможет поставить результат в ваш первоначальный вопрос, если сможете. Кроме того, какой тип dtabase это (MySQL, Oracle, ...)? –

+0

его база данных DB2, мне нужно напечатать значение байтового массива. Но я не уверен перед печатью байтового массива, ему нужно преобразовать в какой-то другой тип данных или нет. –

 Смежные вопросы

  • Нет связанных вопросов^_^