Как преобразовать объект Blob в файл PDF в Java?

У меня есть следующая ситуация в приложении Java.

Из базы данных извлеките этот объект Blob, который представляет файл PDF в базе данных:

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 - если вам нужно отобразить его на веб-странице, создайте сервлет (или контроллер Spring 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