问题描述
我有一个任务来创建一个最多10000条记录的PDF文件。每个记录都是JSON表示形式的Java对象。 10个对象约为15000字节(jsonString.length()
)。包含1000条记录的结果文件在磁盘上大约需要900 KB。然后我做:
private static Font font = new Font(Font.FontFamily.TIMES_ROMAN,12,Font.NORMAL);
Document document = new Document();
PdfWriter.getInstance(document,new FileOutputStream(FILE));
document.open();
Paragraph p = new Paragraph();
p.add(new Paragraph("Title",font));
String jsonString = "{....}"; // 10 objects; jsonString.length()==15000
for (int i = 0; i < 100; i++) // add 1000 objects
p.add(new Paragraph(jsonString,font));
document.add(p);
document.close();
但是,当我运行这段代码时,我正在等待80年代。为什么这么慢?可以更快地做到吗?
更新
当我仅使用一个具有200个对象的段落时,它的运行速度甚至更慢:
Paragraph p = new Paragraph("{......}"); // ~300_000 bytes
document.add(p);
将200个对象另存为PDF需要2分钟,而不是第一种情况下的1000个对象需要1.5分钟。
解决方法
我找到了一个具有OpenPdf库的解决方案。我创建了pdf文件,其中10000条记录的时间为7到17秒,pdf大小为4到32 MB,具体取决于单个记录的大小。
public static void main(String[] args) throws FileNotFoundException {
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc,new FileOutputStream("OpenPDF-example.pdf"));
//setting font family,color
Font font = new Font(Font.HELVETICA,10);
doc.open();
for (int j=0; j<10000; j++) {
Paragraph para = new Paragraph("single record from 1 to 5kB",font);
doc.add(para);
}
doc.close();
writer.close();
}
注意,需要按小段添加数据。当我尝试将所有数据添加到一个段落中时,它的运行速度非常慢(超过10分钟)。