【问题标题】:In PDFBox, why does file size becomes extremely large after saving?PDFBox为什么保存后文件会变得非常大?
【发布时间】:2015-02-20 08:36:34
【问题描述】:

问题

我正在使用 PDFBox 1.8.8 来操作现有的 PDF 文件。保存文档后,输出文件会比原始文件大几倍。这是不可取的。

如何减小输出文件的文件大小?

如何复制我的情况

在下面的代码中,PDFBox 只是加载一个现有的 PDF,然后保存它。没有做其他任何事情。但是文件大小仍然会变大几倍。

以下是两个示例输入文件的链接。对于 input1.pdf,文件大小从 6MB 增加到 50MB。对于 input2.pdf,文件大小从 0.4MB 增加到 1.3MB。

https://dl.dropboxusercontent.com/u/13566649/samplePDF/input1.pdf https://dl.dropboxusercontent.com/u/13566649/samplePDF/input2.pdf

import java.io.*;
import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.exceptions.*;


class Test {

    public static void main(String[] args) throws IOException, COSVisitorException {

        PDDocument document = PDDocument.load("input1.pdf");
        document.save("output.pdf");
        document.close();       
    }
}   

我的尝试

我尝试过使用PDStream 类的addCompression() 方法,如下代码所示。它不会改变任何东西。输出文件大小还是一样的。

class Test2 {

    public static void main(String[] args) throws IOException, COSVisitorException {

        PDDocument document = PDDocument.load("input1.pdf");

        for (int i = 0; i < document.getNumberOfPages(); i++) {
            PDPage page = (PDPage) document.getDocumentCatalog().getAllPages().get(i);
            page.getContents().addCompression();
        }

        document.save("output.pdf");
        document.close();    

    }

}   

【问题讨论】:

  • 我建议您在 PDFBox JIRA 中打开一个问题并附加较小的文件。在初始文件中压缩了大量的“结构”信息,但在保存的文件中没有。
  • 我的意思是对象流。
  • 我为此创建了一个 JIRA 问题。 issues.apache.org/jira/browse/PDFBOX-2690
  • 嗨!我也遇到了同样的问题,请问您找到解决方案了吗?我也尝试使用 PDStream.addCompression 但结果相同 :( 是否有另一个库可以更好地实现这种拆分?

标签: java pdf pdfbox


【解决方案1】:

我写了这个奇怪的代码,它对我有用 (Apache PDFBox v.2.0.8):

private void saveCompressedPDF(PDDocument srcDoc, OutputStream os) throws IOException {
    PDDocument outDoc = new PDDocument();
    outDoc.setDocumentInformation(srcDoc.getDocumentInformation());
    for (PDPage srcPage : srcDoc.getPages()) {
        new PDPageContentStream(outDoc, srcPage,
                PDPageContentStream.AppendMode.APPEND, true).close();
        outDoc.addPage(srcPage);
    }
    outDoc.save(os);
    outDoc.close();
}

【讨论】:

  • 你为每个页面添加一个空的内容流做什么?
  • 您的代码所附文件的尺寸较小可能是因为您的代码没有复制结构树。
  • 完全相同的文件大小 2.0.17
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多