2009-08-06 11 views
6

J'ai utilisé Flying Saucer depuis un moment maintenant avec des résultats impressionnants.Quelle est la manière la plus simple de convertir une chaîne xhtml en PDF en utilisant Flying Saucer?

je peux définir un document via uri comme si

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

Ce qui est agréable, car il résoudra toutes les ressources relatives css, etc. par rapport à l'URI. Cependant, je génère maintenant le xhtml, et je veux le rendre directement à un fichier PDF (sans enregistrer un fichier). Les méthodes appropriées ITextRenderer semblent être:

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

Comme vous pouvez le voir, mon code existant donne juste le uri et ITextRenderer fait le travail de création du Document pour moi.

Quel est le moyen le plus court de créer le Document à partir de ma chaîne xhtml formatée? Je préférerais utiliser les librairies Flying Saucer existantes sans avoir à importer un autre fichier d'analyse XML (juste pour des bogues et des fonctionnalités constants).

Répondre

5

Les travaux suivants:

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

Auparavant, j'avais essayé

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

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

mais échoue comme il tente de télécharger le code HTML docType de http://www.w3.org (qui retourne 503 est pour les libs java).

+0

C'est exactement ce que je cherchais, merci. – Jared

1

j'utiliser ce qui suit sans problème:

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

Les principales différences ici passent dans un URI nul, et a également fourni le DocumentBuilder avec un résolveur entité.