7

Ho un documento xhtml che sto trasformando in PDF usando il flyingsaucer. Il xhtml ha diversi tag che hanno in linea immagini codificate Base64. La fonte di xhtml è dinamica, quindi la struttura di dove sono i tag immagine può variare. Questo è un esempio di ciò che il tag appare come:Renderizza l'immagine incorporata in PDF usando Flying-Saucer da html

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAagAAAEuCAYAAADbW4YFAAAgAElEQVR4Aex9CYBdRZ ... 

Quando guardo il codice HTML in un browser, viene visualizzata l'immagine correttamente, però, l'elemento img non ottiene reso nel PDF finale. Ecco come lo sto rendendo disponibile per creare il PDF.

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(builder.parse(source), ""); 
renderer.layout(); 
renderer.createPDF(response.getOutputStream(),true); 

Qualcuno può farmi sapere quale approccio dovrei adottare per raggiungere questo obiettivo? Ho visto this posting, tuttavia, sto usando le immagini in linea, quindi non riesco a vedere come posso farlo usando la soluzione di Edd.

Grazie in anticipo

+0

C'è una funzione richiesta est per rendere l'URL dei dati per le immagini funziona direttamente in Flying Saucer: https://code.google.com/p/flying-saucer/issues/detail?id=202 – Thilo

risposta

7

Sì, è possibile utilizzare l'approccio dato qui: Render image from servlet in flyingsaucer generated pdf

Dove Edd ha:

 InputStream input = null; 
     try { 
      input = ...; 
      byte[] bytes = IOUtils.toByteArray(input); 
      Image image = Image.getInstance(bytes); 

Nel caso di Edd l'immagine proviene da una fonte remota (lui salta sopra quel bit con input = ...;). Nel tuo caso, vuoi solo leggerlo dai tuoi dati codificati Base64 (il testo dopo lo base64,. Prima usa un Base64 decoder per ottenere i dati binari, in un byte[] o in Stream, puoi quindi usare Java ImageIO per creare l'immagine dai tuoi byte e seguire l'approccio di Edd per ottenere l'immagine nel PDF Complimenti a Edd qui (upvote di sicuro!)

+2

Sono riuscito a farlo funzionare con questo approccio. Grazie! –

4

Flying-Saucer supporta i dati:... il protocollo nativo Tutto quello che dovete fare è registrare un gestore di protocollo:

-Djava.protocol.handler.pkgs=org.xhtmlrenderer.protocols 

Nessuna necessità per servlet whatsoverver

+2

Hai un collegamento per la registrazione dei gestori di protocollo? –

+0

Legenda - grazie! – rodnaph