2009-08-06 17 views
6

Sto usando Flying Saucer per un po 'ora con risultati impressionanti.Qual è il modo più semplice per convertire una stringa xhtml in PDF usando Flying Saucer?

posso impostare un documento tramite URI in questo modo

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(xhtmlUri); 

che è bello, come si risolverà tutte le risorse CSS relativi ecc relativi alla URI. Tuttavia, sto generando il xhtml e voglio renderlo direttamente a un PDF (senza salvare un file). I metodi adeguati di ITextRenderer sembrano essere:

private Document loadDocument(final String uri) { 
    return _sharedContext.getUac().getXMLResource(uri).getDocument(); 
} 

public void setDocument(String uri) { 
    setDocument(loadDocument(uri), uri); 
} 

public void setDocument(Document doc, String url) { 
    setDocument(doc, url, new XhtmlNamespaceHandler()); 
} 

Come si può vedere, il mio codice esistente dà solo l'URI e ITextRenderer fa il lavoro di creazione del Document per me.

Qual è il modo più semplice per creare lo Document dalla stringa xhtml formattata? Preferirei usare le librerie esistenti di Flying Saucer senza dover importare un altro jar di analisi XML (solo per motivi di funzionalità e bug coerenti).

risposta

5

le seguenti opere:

Document document = XMLResource.load(new ByteArrayInputStream(templateString.getBytes())).getDocument(); 

In precedenza, avevo provato

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(false); 

final DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); 
Document document = documentBuilder.parse(new ByteArrayInputStream(templateString.getBytes())); 

ma che non riesce nel tentativo di scaricare il DOCTYPE HTML da http://www.w3.org (che restituisce 503 del per le librerie Java).

+0

Questo è esattamente quello che stavo cercando, grazie. – Jared

1

Uso il seguente senza problemi:

final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
    documentBuilderFactory.setValidating(false); 
    DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); 
    builder.setEntityResolver(FSEntityResolver.instance()); 
    org.w3c.dom.Document document = builder.parse(new ByteArrayInputStream(doc.toString().getBytes())); 

    ITextRenderer renderer = new ITextRenderer(); 
    renderer.setDocument(document, null); 
    renderer.layout(); 
    renderer.createPDF(os); 

Le differenze fondamentali qui passano in un null URI, e anche fornito il DocumentBuilder con un resolver entità.

Problemi correlati