PDF 压缩技术

问题描述 投票:0回答:3

我正在尝试用Java压缩PDF文档。原始文件大小为 1.5-2 MB,我们需要将其减小到 1 MB 以下。 我尝试对其使用 iText 压缩,但结果并不那么有效,文件大小仍然大于 1 MB。

byte[] mergedFileContent = byteArrayOS.toByteArray();
reader = new PdfReader(mergedFileContent);
PdfStamper stamper = new PdfStamper(reader, byteArrOScomp);
stamper.setFullCompression();
stamper.close();
reader.close();

有人做过类似的事情吗?任何意见将不胜感激。

java pdf compression itext
3个回答
3
投票

您可能想查看官方 iText 示例,特别是示例 HelloWorldCompression 是关于在初始 PDF 创建时和作为后处理步骤应用不同程度的压缩。

该示例中的以下方法可能会对您有所帮助。

public void compressPdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest), PdfWriter.VERSION_1_5);
    stamper.getWriter().setCompressionLevel(9);
    int total = reader.getNumberOfPages() + 1;
    for (int i = 1; i < total; i++) {
        reader.setPageContent(i, reader.getPageContent(i));
    }
    stamper.setFullCompression();
    stamper.close();
    reader.close();
}

如果您想知道我是如何找到它的:我在谷歌上搜索了“itextpdf example full compression”,这是第二个结果。 (第一个发现包含相同的方法,但不是来自 iText 官方网站。)


0
投票

之后您可以对文件进行 gzip、zip 等操作。它并不是真正的 PDF 压缩格式,但如果您受到限制并想要更好的压缩,那么压缩整个内容可能会产生良好的结果,因为它可以压缩元级数据。


0
投票

PDF 已经通过多种方式进行了压缩,这使得外部压缩实用程序无法获得太多支持。显然,如果您解压 PDF,那么外部实用程序将更容易找到要压缩的冗余和模式。

据我所知,没有任何工具可以在不重新打印的情况下解压 PDF。 Ghostscript 可以将现有的 PDF 重新打印到新的 PDF 中,我们可以告诉它在第二个版本中避免压缩。 gs -dCompressPages=false -dCompressFonts=false -dCompressStreams=false -dEncodeColorImages=false -dEncodeGrayImages=false -dEncodeMonoImages=false -dFirstPage=3 -dLastPage=45 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/screen -dSubsetFonts=true -dColorImageResolution=96 -dGrayImageResolution=96 -sOutputFile=raw-copy.pdf src.pdf

即使生成的副本很大(因为它不使用压缩),也可以使用外部工具更有效地打包

zpaqf a raw-copy raw-copy.pdf -m5 -verify

	
© www.soinside.com 2019 - 2024. All rights reserved.