【问题标题】:Create PDF using byte array from database使用数据库中的字节数组创建 PDF
【发布时间】:2016-06-03 06:22:47
【问题描述】:

我正在尝试从来自数据库的字节数组创建 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);
    }


}
}

【问题讨论】:

  • 永远不要在不处理的情况下捕获异常。将e.printStacktrace()添加到catch块内,查看是否发生异常
  • 即使我添加 printStackTrace() 也没有出现错误
  • 你有 3 个catch在里面。其中一个吞下了Exception
  • 不,它实际上运行良好并创建了 pdf 文件,但是创建的 pdf 文件没有打开
  • 您有System.out.println 输出。他们是否显示了合理的数据?并请分享损坏的 PDF 以供分析。

标签: java pdf pdf-generation bytearray


【解决方案1】:

您用来从数据库中读取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();

    }

}

【讨论】:

  • 实际上数据库中的 AUD_TRAIL_MSG_TX 数据类型是 bytes[] 这就是为什么我在挣扎
  • 这很有趣。你能得到数据库列定义吗?类似于DESC tgpoa01.aud_trail_dtl; 的东西。如果可以的话,将结果放入您的原始问题中会有所帮助。另外,它是什么类型的数据库(MySQL、Oracle、...)?
  • 它是一个 DB2 数据库,我需要打印字节数组值。但不确定在打印字节数组之前是否需要转换为其他数据类型。
  • 我想这取决于它是如何存储的...您可以访问该代码吗?
  • 仅以字节数据类型存储
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多