Какой самый простой способ конвертировать строку xhtml в PDF с помощью Flying Saucer?

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

Я могу установить документ через 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 ответа

Решение

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

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-docType с http://www.w3.org/ (который возвращает 503 для java-библиотек).

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

    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 распознавателя сущностей.

Другие вопросы по тегам