Добавить HTML в документ iText в памяти, используя XHTMLrenderer (FlyingSaucer) - PullRequest
0 голосов
/ 25 мая 2011

Я использую iText 2.1.7 для создания документа из базы данных.Одно из полей, которое мне нужно добавить, находится в формате XHTML.Я могу использовать класс HTMLWorker для генерации HTML, но это немного ограничено.

Я конвертирую это в XHTML, используя следующий код:

String url = chapterDesc.getString("description").toString(); // get the HTML string from the database
org.w3c.dom.Document doc = XMLResource.load(new ByteArrayInputStream(url.getBytes())).getDocument();

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
ByteArrayOutputStream os = new ByteArrayOutputStream();
renderer.layout();
renderer.createPDF(os);

Я хочу добавить эту информациюдокумент в памяти.Возможно ли это?

Нужно ли использовать PdfStamper?Я считаю, что для этого необходимо закрыть документ?Если это возможно, я бы хотел не использовать несколько проходов для добавления этих описаний.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2014

Я знаю, что прошло больше двух лет с тех пор, как вы спросили, но я столкнулся с той же проблемой.Я гуглил решение, и, видимо, нигде не было найдено.Поэтому я должен был разработать свою собственную, и я подумал, что мог бы поделиться этим.Надеюсь, это кому-нибудь пригодится.

Я пытался использовать летающую тарелку, как и вы, но у меня это не сработало.Мой кусок HTML был простой таблицей, поэтому я мог использовать iText HTMLWorker для анализа.

Итак, сначала я получаю PdfStamper, как вы предложили.

PdfReader template = new PdfReader(templateFileName);
PdfStamper editablePage = new PdfStamper(template, reportOutStream);

Затем я работаю сдокумент (заполните поля, вставьте несколько изображений) и после этого мне нужно вставить фрагмент HTML.

//getting a 'canvas' to add parsed elements
final ColumnText page = new ColumnText(editablePage.getOverContent(pageNumber)); 
//finding out the page sizefinal 
Rectangle pagesize = editablePage.getReader().getPageSize(pageNumber);     
//you can define any size here, that will be where your parsed elements will be added
page.setSimpleColumn(0, 0, pagesize.getWidth(), pagesize.getHeight()); 

Если вам нужно простое оформление, HTMLWorker может кое-что сделать

StyleSheet styles = new StyleSheet();
styles.loadStyle("h1", "color", "#008080");

//parsing
List<Element> parsedTags = HTMLWorker.parseToList(new StringReader(htmlSnippet), styles); 
for (Element tag : parsedTags)
{       
  page.addElement(tag);
  page.go();
}

Это лишь некоторые основные идеи, как это сделать, надеюсь, это поможет.

0 голосов
/ 25 ноября 2011

Летающая тарелка не работает корректно с любой версией iText, кроме 2.0.8.Кроме того, поскольку вы имели в виду создание PDF в памяти, вы используете JSF, JSP или сервлеты?Если это так, вы можете просто отправить свой ByteArrayOutputStream в качестве ответа на одной из этих страниц, используя что-то вроде

response.setContentType("application/pdf");
response.setContentLength(os.size());
os.writeTo(response.getOutputStream());
response.flushBuffer();
...