2009-08-06 7 views
6

私はFlying Saucerをしばらく使っています。それは与えられたURIに対するすべての相対CSSリソースなどを解決しますようFlying Saucerを使用してxhtml文字列をPDFに変換する最も簡単な方法は何ですか?

私は、いいですので

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

のようなURIを経由して原稿をセットすることができます。しかし、私は現在、xhtmlを生成しており、ファイルを保存せずに直接PD​​Fにレンダリングしたいと考えています。 ITextRendererでの適切な方法があるように見える:

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

あなたが見ることができるように、私の既存のコードは、単にURIを与え、ITextRendererは私のためにDocumentを作成する作業を行います。

フォーマットされたxhtml文字列からDocumentを作成する最短の方法は何ですか?私は別のXML解析用のjarファイルをインポートすることなく、既存のFlying Saucerライブラリを使用することをお勧めします(一貫したバグと機能性のためです)。

答えて

5

次作品:

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

は以前、私は

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

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

をしようとしたが、それは(JavaのLIBSのための503年代を返す) http://www.w3.orgからHTML DOCTYPEをダウンロードしようとして、それが失敗します。

私は問題なく、次を使用し
+0

これは私が探していたものです。ありがとうございます。 – Jared

1

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

ここで重要な違いがnullのURIを渡し、また、実体リゾルバではDocumentBuilderを提供しています。