2009-08-06 20 views
6

Używam już od pewnego czasu Flying Saucer z niesamowitymi wynikami.Jaki jest najłatwiejszy sposób konwertowania ciągu xhtml na format PDF za pomocą Latającego talerza?

mogę ustawić dokument poprzez URI jak tak

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

co jest miłe, jak to rozwiązać wszystkie względne zasobów css itp stosunku do podanego URI. Jednak teraz generuję xhtml i chcę renderować go bezpośrednio do pliku PDF (bez zapisywania pliku). Odpowiednie metody ITextRenderer wydają się być:

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()); 
} 

Jak widać, mój istniejącego kodu tylko daje uri i ITextRenderer działa tworzenia Document dla mnie.

Jaki jest najkrótszy sposób tworzenia Document z mojego sformatowanego ciągu Xhtml? Wolałbym używać istniejących bibliotek Flying Saucer bez konieczności importowania innego słoika parsującego XML (tylko ze względu na spójne błędy i funkcjonalność).

Odpowiedz

5

następujące utwory:

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

Wcześniej próbowałem

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

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

ale to się nie uda, ponieważ próbuje pobrać DOCTYPE HTML z http://www.w3.org (zwraca 503 za okres bibliotekami Java).

+0

To jest dokładnie to, czego szukałem, dzięki. – Jared

1

używam następujących bez problemu:

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); 

Główne różnice są tu przekazując null URI, a także pod warunkiem, że DocumentBuilder z rezolwerem podmiotu.