gpt4 book ai didi

java - 从大量数据生成大 PDF

转载 作者:搜寻专家 更新时间:2023-11-01 01:26:15 24 4
gpt4 key购买 nike

我从生成 HTML DOM 的数据库中读取数据。数据量巨大,无法一次放入内存,但可以逐 block 提供。

我想使用 Flying Saucer 将生成的 HTML 转换为 PDF :

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);
}

这种方法的问题是,chunk 的最后一页不一定完全填满数据。有什么解决方案可以填补空间吗?例如,我可以考虑检查最后一页是否未完全归档然后丢弃它(不写入 PDF)的方法,还可以找出该页面上呈现的数据并倒回数据库中的位置(currentLine 在例子中)。如果有人可以发布完整的解决方案,那就太好了。

最佳答案

正如我在评论中提到的那样,通过先创建 HTML 然后将 HTML 转换为 PDF 从数据源创建 PDF 是在浪费内存和处理时间。您还引入了大量不必要的复杂性。

在您的评论中,您提到了低级功能,例如 moveTo()lineTo() .使用绘制每一行和每个单词的低级操作来绘制表格确实是疯狂的。

您应该使用 PdfPTable类(class)。 ArrayToTable 示例是一个非常简单的 POC,其中数据以 List<List<String>> 的形式出现.代码就这么简单:

PdfPTable table = new PdfPTable(8);
table.setWidthPercentage(100);
List<List<String>> dataset = getData();
for (List<String> record : dataset) {
for (String field : record) {
table.addCell(field);
}
}
document.add(table);

当然:您正在谈论一个巨大的数据集,在这种情况下,您可能不想构建 table首先在内存中,然后在将表添加到文档时刷新内存。在构建表格时,您需要添加表格的一小部分。这就是 MemoryTests 中发生的事情例子。添加这一行:

table.setComplete(false);

您可以一点一点地添加表格(在示例中:每 10 行)。当您完成向表中添加单元格后,您应该这样做:

table.setComplete(true);
document.add(table);

这将添加最后一行。

如果您想要一个带有重复页眉和/或页脚的表格,请查看此 PDF 中的表格:header_footer_1.pdf

HeaderFooter1 HeaderFooter2 示例将向您展示它是如何完成的。

关于java - 从大量数据生成大 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24414210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com