如何在多次绑定同一个 pdf 时减小输出 pdf 大小 java
How to reduce the output pdf size when bind the same pdf many times java
我尝试在java中写一个活页夹来制作一个"two-up"层使用多次相同的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...这非常大
编辑:link 到 pdf 使用pdf
一个简单的算法优化有助于使代码速度更快,并解决您的结果文件大小问题。与其每次要插入页面时都制作一个新的副本(基本上是 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 秒。
我尝试在java中写一个活页夹来制作一个"two-up"层使用多次相同的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...这非常大
编辑:link 到 pdf 使用pdf
一个简单的算法优化有助于使代码速度更快,并解决您的结果文件大小问题。与其每次要插入页面时都制作一个新的副本(基本上是 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 秒。