Какой самый простой способ преобразования строки xhtml в PDF с помощью Flying Saucer? - PullRequest
6 голосов
/ 06 августа 2009

Я уже некоторое время пользуюсь Летающая тарелка с потрясающими результатами.

Я могу установить документ через URI, как это так

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

Что приятно, поскольку он разрешает все относительные ресурсы CSS и т. Д. Относительно данного URI. Тем не менее, я сейчас создаю xhtml и хочу сделать его прямо в PDF (без сохранения файла). Подходящие методы в 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 для меня.

Какой самый короткий способ создания Document из моей отформатированной строки xhtml? Я бы предпочел использовать существующие библиотеки Flying Saucer без необходимости импортировать еще один jar-файл для разбора XML (только ради согласованных ошибок и функциональности).

Ответы [ 2 ]

5 голосов
/ 11 августа 2009

работают следующие работы:

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

, но это не удается, поскольку он пытается загрузить HTML-тип документа из http://www.w3.org (который возвращает 503 для библиотек Java).

1 голос
/ 09 ноября 2009

Я без проблем использую следующее:

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

Ключевые различия здесь передаются в нулевом URI, а также предоставляют DocumentBuilder распознаватель сущностей.

...