2011-12-06 20 views
6

Estoy intentando renderizar una página HTML en PDF utilizando Flying-Saucer. El HTML se crea en la memoria y transfiere al procesador comoCómo establecer la URL base en Flying-Saucer, mientras se procesa HTML a PDF?

renderer.setDocumentFromString(new String(htmlByteArray)); 

La cuestión es que tengo <img src="images.jpg"/> en el HTML y no está recibiendo dictada en el código HTML final. La imagen se encuentra en la carpeta resources del paquete.

He intentado establecer la URL base con los siguientes, pero sin éxito:

 
ITextRenderer renderer = new ITextRenderer(); 
renderer.getSharedContext().setBaseURL("com/org/tools/designer/resources/"); 
System.out.println(renderer.getSharedContext().getBaseURL()); 
renderer.setDocumentFromString(new String(htmlByteArray)); 
renderer.layout(); 
renderer.createPDF(os); 
+0

¿Ha intentado 'setBaseURL' con una base real ** ** URL? P.ej. 'file: /// --- path-to-resources --- com/org/tools/designer/resources /' – mkl

Respuesta

3

Hay una interfaz muy fresco en FS llamada UserAgentCallback que le permite obtener todos sus propios recursos. Para otras personas mirando este puede configurar la dirección URL correspondiente:

renderer.getSharedContext().getUserAgentCallback().setBaseURL("url_to_resources"); 

Sin embargo, usted tiene un caso especial aquí, que tienen recursos incrustados dentro de su archivo JAR que necesitan una forma especial para ser visitada. Puede implementar su propio UserAgentCallback Heres un pequeño que escribí para usted. (No probé esto, así que quizás debas depurarlo un poco).

Este bit de código extiende el ITextUserAgent de esa manera solo tiene que sobreescribir el método getBinaryResource y dejar el resto a la biblioteca. Si esto no funciona, puede buscar implementar un completo en UserAgentCallback.

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import org.xhtmlrenderer.pdf.ITextOutputDevice; 
import org.xhtmlrenderer.pdf.ITextUserAgent; 

public class PackageUserAgentCallback extends ITextUserAgent { 
    private Class resourceClass; 

    public PackageUserAgentCallback(ITextOutputDevice outputDevice, Class resourceClass) { 
     super(outputDevice); 
     this.resourceClass = resourceClass; 
    } 

    @Override 
    public byte[] getBinaryResource(String uri) { 
     try { 
      InputStream in = resourceClass.getResourceAsStream(uri); 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      int numRead; 
      byte [] buffer = new byte[256]; 
      while((numRead = in.read(buffer)) != -1) { 
       out.write(buffer, 0, numRead); 
      } 
      return out.toByteArray(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 

continuación, puede establecer esto a su UserAgentCallback, esto sería dirigir todas las peticiones de recursos a través de su PackageUserAgentCallback

ITextRenderer renderer = new ITextRenderer(); 
renderer.getSharedContext().setUserAgentCallback(
     new PackageUserAgentCallback(renderer.getOutputDevice(), Resources.class)); 
System.out.println(renderer.getSharedContext().getBaseURL()); 
renderer.setDocumentFromString(new String(htmlByteArray)); 

renderer.layout(); 
renderer.createPDF(os);