Je lis les données de la base de données à partir de laquelle je génère HTML DOM. Le volume de données est énorme donc il ne peut pas entrer dans la mémoire à la fois, mais il peut être fourni morceau par morceau.Générer un gros PDF à partir d'une énorme quantité de données
Je voudrais transformer en résultant HTML PDF en utilisant 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);
}
Le problème avec cette approche est que la dernière page du morceau est pas nécessairement complètement rempli de données. Y a-t-il une solution pour remplir l'espace? Par exemple je pourrais penser à l'approche qui vérifiera que la dernière page n'est pas complètement classée et puis la jeter (pas écrire au pdf), découvrir également quelles données ont été rendues sur cette page et rembobiner la position dans la base de données (exemple) . Ce serait bien si l'on peut poster une solution complète.
Mauvaise idée. D'abord vous créez le HTML qui prend beaucoup d'espace, puis vous utilisez ce HTML pour créer des PDF. Si la mémoire compte, vous devez créer le PDF directement à partir des données sans d'abord créer le code HTML. –
Oui, mais combien de code devrais-je écrire pour rendre le HTML en utilisant les primitives de bas niveau iText ('moveTo()', 'lineTo()', 'beginText()')? Maintenant, j'ai 50 lignes de code, facile à gérer. HTML et CSS sont familiers à tout le monde. Changer la disposition ou les couleurs n'est pas un problème. Bruno, j'ai regardé brièvement ton livre "iText en action" (merci beaucoup!) Et déjà la magie des en-têtes/pieds de page à la page 430 (chapitre 14) fait peur. J'utiliserais volontiers 'com.itextpdf.tool.xml.pipeline.html.HtmlPipeline' mais il ne supporte pas les sélecteurs CSS de base, ne parle pas de boîtes flottantes. –
Pourquoi utiliseriez-vous des primitives de bas niveau? Je vais vous donner quelques indications sur des exemples faciles dans une réponse. –