Как да конвертирате Blob обект в PDF файл в Java?

Имам следната ситуация в Java приложение.

От базата данни извлечете този Blob обект, който е представянето на PDF файл в DB:

Blob blobPdf = cedolinoPdf.getAllegatoBlob();

Сега трябва да го конвертирам в PDF файл. Как мога да направя тази задача?

Tnx


person AndreaNobili    schedule 29.01.2015    source източник
comment
Какво имаш предвид? Вече е PDF файл, или? И така, какво искате да направите? Покажи го? Запази го?   -  person ControlAltDel    schedule 29.01.2015
comment
@ControlAltDel Трябва да го покажа в JSP страница   -  person AndreaNobili    schedule 30.01.2015
comment
@AndreaNobili - ако трябва да го покажете в уеб страница, създайте сървлет (или пролетен MVC контролер или каквото и да е), който получава Blob и пренасочва неговия входен поток към изходния поток на сервлета. След това във вашата страница можете да създадете рамка (или обект за преглед на PDF), която сочи към вашия сервлет   -  person BretC    schedule 30.01.2015


Отговори (3)


Можете да използвате getBinaryStream() от ResultSet, след което можете да създадете файл от InputStream, върнат от getBinaryStream().

Вашият код може да изглежда така

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); 
    }

Ако имате нужда от всички петна, направете итерация на набора от резултати

person Tanmoy Bhattacharjee    schedule 29.01.2015

Ако 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"

person BretC    schedule 29.01.2015
comment
Доколкото знам, Blob няма getInputStream, а getBinaryStream(): docs.oracle.com/javase/7/docs/api/java/sql/Blob.html - person Albert; 29.01.2015
comment
@Albert благодаря, че забеляза това - актуализирах отговора съответно - person BretC; 29.01.2015

можете да използвате 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();
person Gaurab Pradhan    schedule 12.02.2015
comment
Какво е Long.MAX_VALUE в този пример? Няма ли начин да получите размера на ReadableByteChannel? - person jabe; 29.01.2016
comment
Log.MAX_VALUE е константа, съдържаща максималната стойност - person Gaurab Pradhan; 09.03.2016