多次绑定同一PDF时如何减小输出pdf大小

时间:2019-06-19 17:57:58

标签: java pdf itext itext7

我尝试用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

1 个答案:

答案 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秒。

相关问题