簡體   English   中英

使用數據庫中的字節數組創建PDF

[英]Create PDF using byte array from database

我正在嘗試從來自數據庫的字節數組中創建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);
    }


}
}

您用來從數據庫讀取bytesfor循環對我來說有點奇怪。 您可以嘗試以下( 完全未經測試的 )替代方法之一:

使用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();

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM