Я читаю данные из базы данных, из которой я генерирую HTML DOM. Объем данных огромен, поэтому он не может сразу уместиться в памяти, однако его можно предоставлять по частям.
Я хочу преобразовать полученный HTML в PDF с помощью Flying Saucer:
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.DOMWriter;
OutputStream bodyStream = outputMessage.getBody();
ITextRenderer renderer = new ITextRenderer();
DocumentFactory documentFactory = DocumentFactory.getInstance();
DOMWriter domWriter = new DOMWriter();
Element htmlNode = documentFactory.createElement("html");
Document htmlDocument = documentFactory.createDocument(htmlNode);
int currentLine = 1;
int currentPage = 1;
try {
while (currentLine <= numberOfLines) {
currentLine += loadDataToDOM(documentFactory, htmlNode, currentLine, CHUNK_SIZE);
renderer.setDocument(domWriter.write(htmlDocument), null);
renderer.layout();
if (currentPage == 1) {
// For the first page the PDF writer is created:
renderer.createPDF(bodyStream, false);
}
else {
// Other documents are appended to current PDF writer:
renderer.writeNextDocument(currentPage);
}
currentPage += renderer.getRootBox().getLayer().getPages().size();
}
// Finalise the PDF:
renderer.finishPDF();
}
catch (DocumentException e) {
throw new IOException(e);
}
catch (org.dom4j.DocumentException e) {
throw new IOException(e);
}
finally {
IOUtils.closeQuietly(bodyStream);
}
Проблема с этим подходом заключается в том, что последняя страница чанка не обязательно полностью заполнена данными. Есть ли решение заполнить пространство? Например, я мог бы подумать о подходе, который будет проверять, что последняя страница не заполнена полностью, а затем отбрасывать ее (не записывать в PDF), а также узнавать, какие данные были отображены на этой странице, и перематывать позицию в базе данных (в примере currentLine
) . Было бы неплохо, если бы кто-то мог опубликовать полное решение.
moveTo()
,lineTo()
,beginText()
)? Теперь у меня 50 строк кода, которыми легко управлять. HTML и CSS знакомы всем. Изменение макета или цветов не проблема. Бруно, я бегло просмотрел вашу книгу iText в действии (большое спасибо за нее!), и уже пугает магия верхних и нижних колонтитулов на странице 430 (глава 14). Я бы с удовольствием использовалcom.itextpdf.tool.xml.pipeline.html.HtmlPipeline
, но он не поддерживает базовые селекторы CSS, не говоря уже о плавающих блоках. - person dma_k   schedule 26.06.2014