如何在 Java 中将 Blob 对象转换为 PDF 文件?

How to convert a Blob object into a PDF file in Java?

我有以下情况进入Java申请。

从数据库中检索此 Blob 对象,该对象代表数据库中的 PDF 文件:

Blob blobPdf = cedolinoPdf.getAllegatoBlob();

现在我必须将它转换成 PDF 文件。我该如何完成这个任务?

Tnx

如果 Blob 是 PDF 的二进制表示,您需要做的就是获取字节。如果您想将 PDF 写入文件,您可以这样做...

Blob blobPdf = ...;
File outputFile = new File("/tmp/blah/whatever.pdf");
FileOutputStream fout = new FileOutputStream(outputFile);
IOUtils.copy(blobPdf.getBinaryStream(), fout);

这应该将您的 PDF 写入名为“/tmp/blah/whatever.pdf”的文件中

您可以使用 ResultSet 中的 getBinaryStream(),然后您可以从 getBinaryStream() 返回的 InputStream 创建一个文件。

您的代码可能如下所示

Connection connection = null;
Statement statement = null;
ResultSet rs = null;
  
try {
         
        Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
        connection = DriverManager.getConnection(connectionURL, "sa", "sa");
        statement = connection.createStatement();
        rs = statement.executeQuery("SELECT fileName,blobFile FROM tblBlobFiles");
     
     
        if (rs.next()) {
  
String filename = rs.getString(1);
           Blob blob = rs.getBlob(2);
          InputStream is = blob.getBinaryStream();
              FileOutputStream fos = new FileOutputStream("C:\DownloadedFiles"+ "\" + filename);
 
int b = 0;
while ((b = is.read()) != -1)
{
    fos.write(b); 
}
        }
    } catch (IOException e) 
    {
    e.getMessage (); e.printStackTrace(); 
System.out.println(e); 
    } 
    catch (SQLException e) 
    {
    e.getMessage (); e.printStackTrace(); 
System.out.println(e); 
    }

如果您需要所有 blob,请对结果集进行迭代

你可以使用Java NIO

InputStream fileBolb = rs.getBinaryStream("columnName");
ReadableByteChannel rbc = Channels.newChannel(fileBolb );
FileOutputStream fos = new FileOutputStream(filePath + fname);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();

将 Blob 转换为 PDF 并不是那么简单的任务。 我曾使用 itext.5.5.9.jar 来实现同样的效果,这是我的代码:

public static void blobToPDF(String[] args) throws IOException {

    Blob blobPdf = ....;

    com.itextpdf.kernel.pdf.PdfReader newreader = null;

    try (InputStream targetStream = blobPdf.getBinaryStream()) {

        newreader = new com.itextpdf.kernel.pdf.PdfReader(targetStream);

        System.out.println("Reading PDF using com.itextpdf.kernel.pdf.PdfReader...");
        System.out.println("PDF read success with kernel package ");
        System.out.println("PDF length = " + newreader.getFileLength());

    } catch (InvalidPdfException | FileNotFoundException | SQLException ipe) {
        ipe.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        if (newreader != null)
            newreader.close();
    }
}