2009-08-06 31 views
6

Tôi đã sử dụng Flying Saucer trong một thời gian với kết quả tuyệt vời.Cách dễ nhất để chuyển đổi chuỗi xhtml sang PDF bằng Flying Saucer là gì?

tôi có thể thiết lập một tài liệu qua uri như vậy

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

Đó là tốt đẹp, vì nó sẽ giải quyết tất cả các nguồn lực css tương vv liên quan đến các URI nhất định. Tuy nhiên, bây giờ tôi đang tạo xhtml và muốn hiển thị trực tiếp nó thành một tệp PDF (không lưu tệp). Các phương pháp thích hợp trong ITextRenderer dường như là:

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

Như bạn thấy, mã hiện tại của tôi chỉ cung cấp cho các uri và ITextRenderer làm công việc của việc tạo ra các Document cho tôi.

Cách ngắn nhất để tạo Document từ chuỗi xhtml được định dạng của tôi là gì? Tôi muốn sử dụng các thư viện Bay Saucer hiện có mà không phải nhập một lọ phân tích cú pháp XML khác (chỉ vì các lỗi và chức năng nhất quán).

Trả lời

5

Các công trình sau đây:

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

Trước đây, tôi đã cố gắng

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

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

nhưng thất bại vì nó cố gắng để tải về DOCTYPE html từ http://www.w3.org (trả về của 503 cho libs java).

+0

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn. – Jared

1

tôi sử dụng sau đây mà không vấn đề:

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

Sự khác biệt quan trọng ở đây là đi qua trong một null URI, và cũng có thể cung cấp các DocumentBuilder với một resolver thực thể.

Các vấn đề liên quan