我尝试用Java编写一个活页夹,以使用多次相同的pdf制作“双向”图层,问题是文件的输出大小太大,如何对其进行优化?
我放了SmartMode,但没有帮助。
String infile = "D:\\libro\\libro.pdf";
String outfile = "D:\\libro\\test_out.pdf";
FileOutputStream output = new FileOutputStream(outfile);
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outfile).setSmartMode(true));
pdfDoc.setDefaultPageSize(PageSize.A2.rotate());
PdfPage pageorig, pagenew;
PdfCanvas canvas;
PdfDocument reader = new PdfDocument(new PdfReader(infile));
int pages = reader.getNumberOfPages();
for (int j = 0; j < 10; j++) {
for (int i = 1; i <= pages; i++) {
pageorig = reader.getPage(i);
pagenew = pdfDoc.addNewPage();
canvas = new PdfCanvas(pagenew);
canvas.addXObject(pageorig.copyAsFormXObject(pdfDoc), 0, 0);
canvas.addXObject(pageorig.copyAsFormXObject(pdfDoc), pageorig.getPageSize().getWidth(), 0);
}
}
pdfDoc.close();
reader.close();
原始pdf大小为20Mb,如果制作一份,输出文件为19Mb,但是如果我制作10份,输出文件为83Mb ...这很大
编辑:链接到使用的pdf pdf
答案 0 :(得分:1)
简单的算法优化可以帮助您更快地编写代码,并解决文件大小带来的问题。您不必每次都要插入新的页面副本(基本上是10 * 2次),而是可以为每个页面制作一次副本,然后再使用10 * 2次。在我的代码中,我使用带有Map
的惰性缓存,并在我们未命中(尚未复制页面)时进行复制。也可以用另一种方式完成-遍历文档页面并事先制作新副本。
这是代码的优化版本:
String infile = "D:\\libro.pdf";
String outfile = "D:\\test_out.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outfile).setSmartMode(true));
pdfDoc.setDefaultPageSize(PageSize.A2.rotate());
PdfPage pageorig, pagenew;
PdfCanvas canvas;
PdfDocument reader = new PdfDocument(new PdfReader(infile));
// Caching page copies
Map<Integer, PdfFormXObject> pageCopies = new HashMap<>();
int pages = reader.getNumberOfPages();
for (int j = 0; j < 10; j++) {
for (int i = 1; i <= pages; i++) {
pageorig = reader.getPage(i);
PdfFormXObject origPageCopy = pageCopies.get(i);
// Cache miss, doing a fresh copy
if (origPageCopy == null) {
origPageCopy = pageorig.copyAsFormXObject(pdfDoc);
pageCopies.put(i, origPageCopy);
}
pagenew = pdfDoc.addNewPage();
canvas = new PdfCanvas(pagenew);
canvas.addXObject(origPageCopy, 0, 0);
canvas.addXObject(origPageCopy, pageorig.getPageSize().getWidth(), 0);
}
}
pdfDoc.close();
reader.close();
在我的计算机上,生成的文件大小约为15MB,甚至小于原始文件大小。此外,此代码的运行时间约为3秒,而初始版本的运行时间约为25秒。