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

时间:2017-08-31 13:21:48

标签: pdf compression itext7

我有现有的/源PDF源文档,我从中复制了所选页面,并生成了所选页面的目标PDF。现有/源文档中的每个页面都以不同的分辨率进行扫描,其大小各不相同:

  1. 生成的文档有4页=> 175 kb
  2. 生成的文档有4页=> 923 kb(我想这是因为源文档中每页的扫描分辨率较高)
  3. 压缩此页面的最佳做法是什么? 是否存在压缩/缩小最终PDF大小的代码示例,其中包含不同分辨率的源文档的复制页面?

    最诚挚的问候

1 个答案:

答案 0 :(得分:2)

如果您只是将扫描添加到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会让生活变得更加困难。想象一下那些必须在你之后处理该文档的人。他们打开它,看到文本,尝试选择它,没有任何反应。

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

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

完全压缩模式会将某些对象压缩为对象流,并且还会压缩PDF的交叉引用表。由于文档中的大多数对象都是图像(已经压缩过),因此压缩对象不会产生太大影响,但如果您有大量页面,压缩交叉引用表可能会导致PDF文件较小。