2013-11-19 1 views
3

У меня есть решение, которое вставляет строки в документ XHTML и выводит результаты в виде отчетов. Мой работодатель спросил, можем ли мы извлечь изображения из своей базы данных SQL (хранимой в виде массивов байтов) для вставки в отчеты.IO Issue - Byte Array Image в XHTML (FlyingSaucer)

Я использую FlyingSaucer в качестве интерпретатора XHTML, и я использовал Java DOM для изменения предварительно сохраненных отчетов, которые я сохранил в пакете генератора отчетов.

Единственное решение, о котором я могу думать на данный момент, - это создать изображения, сохранить их в виде файла, связать файл в теге img (или фоновом изображении) в построенном отчете, распечатать отчет и затем удалить файл. Это кажется очень неряшливым, и я думаю, что это будет очень много времени.

Я не могу не чувствовать, что должно быть более элегантное решение. Любые предложения по вставке массива байтов в html?

+0

Почему вы не используете [URI данных] (http://en.wikipedia.org/wiki/Data_URI_scheme)? – Crozin

+0

Я никогда не использовал URI данных. Если вы ответите подробно, как это можно сделать с примером (и это, конечно, работает), то я буду рад принять его. –

ответ

3
  1. Прочитайте изображение и преобразовать его в это кодировкой Base64 форма:

    InputStream image = getClass().getClassLoader().getResourceAsStream("image.png"); 
    String encodedImage = BaseEncoding.base64().encode(ByteStreams.toByteArray(image)); 
    

    Я использовал BaseEncoding и ByteStreams от Google Guava.

  2. Изменить src атрибут img элемент в пределах вашего Document объект.

    Document doc = ...; // get Document from XHTMLPanel.getDocument() or create 
            // new one using DocumentBuilderFactory 
    
    doc.getElementById("myImage").getAttributes().getNamedItem("src").setNodeValue("data:image/png;base64," + encodedImage); 
    
  3. Unfortunatley FlyingSaucer не поддерживает DataURIs из собственных коробок, поэтому вам придется создать свои собственный ReplacedElementFactory. Читайте статью Using Data URLs for embedding images in Flying Saucer generated PDFs - она ​​содержит полное решение.

+0

Awesome. Есть ли способ конвертировать изображение в кодировку Base64 в стандартную библиотеку Java? Мой список библиотек уже слишком длинный в этом проекте. –

+0

IIRC нет стандартного кодировщика Base64 для JSE. Там много библиотек, вы также можете написать свой собственный (см .: http://www.wikihow.com/Encode-a-String-to-Base64-With-Java). Базовая кодировка Base64 тривиальна. – Crozin

+0

@RudiKershaw Если вы используете Sun JDK, то у вас есть 'sun.misc.BASE64Encoder'. Но это недокументировано и, следовательно, может быть удалено без предварительного уведомления с новой (возможно, исправленной ошибкой) выпуском JDK. – FrankPl