使用 iText7 压缩生成的 PDF 的最佳实践

Best practice to compress generated PDF using iText7

我有现有的/源 PDF 源文档,我从中复制选定的页面并使用选定的页面生成目标 PDF。现有/源文档中的每一页都以不同的分辨率扫描,并且大小不同:

  1. 生成的文档有 4 页 => 175 kb
  2. 生成的文档有 4 页 => 923 kb(我想这是因为源文档中每一页的扫描分辨率更高)

压缩此页面的最佳做法是什么? 是否有任何代码示例可以压缩/减小最终 PDF 的大小,其中包含不同分辨率的源文档的复制页面?

最诚挚的问候

如果您只是将扫描件添加到 pdf 文档,如果您使用的是高分辨率图像,则生成的文档的大小会增加。

请记住,iText 是一个 pdf 库。不是图像处理库。

您当然可以使用常规的旧 java 来尝试压缩图像。

public static void writeJPG(BufferedImage bufferedImage, OutputStream outputStream, float quality) throws IOException
{
    Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpg");
    ImageWriter imageWriter = iterator.next();
    ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
    imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    imageWriteParam.setCompressionQuality(quality);
    ImageOutputStream imageOutputStream = new MemoryCacheImageOutputStream(outputStream);
    imageWriter.setOutput(imageOutputStream);
    IIOImage iioimage = new IIOImage(bufferedImage, null, null);
    imageWriter.write(null, iioimage, imageWriteParam);
    imageOutputStream.flush();
}

但实际上,将扫描的图像放入 pdf 中会让生活变得更加困难。想象一下必须在您之后处理该文档的人员。他们打开它,查看文字,尝试 select 它,但没有任何反应。

此外,您可以在创建 PdfWriter 实例时更改 WriterProperties

PdfWriter writer = new PdfWriter(dest,
    new WriterProperties().setFullCompressionMode(true));

完全压缩模式会将某些对象压缩到对象流中,它还会压缩 PDF 的交叉引用table。由于文档中的大部分对象都是图像(已经压缩),因此压缩对象不会有太大影响,但如果您有大量页面,则压缩交叉引用 table 可能会导致较小的 PDF 文件。