Какой самый простой способ конвертировать строку 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 распознавателя сущностей.