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

使用iText7压缩生成的PDF的最佳实践,pdf,compression,itext7,Pdf,Compression,Itext7,我有现有的/源PDF源文档,我从中复制选定的页面,并使用选定的页面生成目标PDF。现有/源文档中的每一页都以不同的分辨率扫描,并且大小也各不相同: 生成的文档有4页=>175 kb 生成的文档有4页=>923KB(我想这是因为源文档中每页的扫描分辨率更高) 压缩此页面的最佳实践是什么? 是否有压缩/缩小最终PDF大小的代码示例,其中包含以不同分辨率复制的源文档页面 最亲切的问候如果您只是在pdf文档中添加扫描,那么如果您使用的是高分辨率图像,则结果文档的大小增加是有意义的 请记住,iText是一

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

  • 生成的文档有4页=>175 kb
  • 生成的文档有4页=>923KB(我想这是因为源文档中每页的扫描分辨率更高)
  • 压缩此页面的最佳实践是什么? 是否有压缩/缩小最终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的交叉引用表。由于文档中的大多数对象都是图像(已压缩),因此压缩对象不会产生多大效果,但如果您有大量页面,压缩交叉引用表可能会产生更小的PDF文件。

    询问我们推荐或查找书籍、工具、软件库的问题,教程或其他非站点资源对于堆栈溢出是非主题的,因为它们往往会吸引固执己见的答案和垃圾邮件。。。我试着礼貌地写下问题:)很高兴你们在这里遵守了我们的友好政策!然而不幸的是,这个社区不喜欢人们询问代码示例,因为它不符合我上面提到的主题外准则。我们希望您向我们展示一些您试图实现的代码,然后解释哪些代码不起作用/您需要帮助什么。这更有可能让你得到一些像样的回答,甚至可能消除你收到的一些反对票作为文件大小增加的部分解释:那么,当你用图像替换文本时,你期望得到什么:)?也就是说,如果你所说的扫描是指在打印出的pdf中进行实际的物理扫描。如果要从一个页面复制到另一个页面,请查看smartmode writer属性。这听起来可能有点刻薄,但如果添加明显错误但几乎错误的代码,则响应率要比完全不添加代码时高得多。这是因为开发人员的大脑是如何工作的。我们不读你的问题,我们读你的代码。我们从经理那里收到了足够多的纯文本邮件,看到您的代码使您成为我们平等的人,我们很可能会帮助您。堆栈溢出的隐藏秘密之一。心理学101-)布鲁诺,谢谢你解释完全压缩是如何工作的。我的源PDF没有很多页/最多10页,它包含通过另一个应用程序扫描的物理文档,我无法更改生成源PDF的方式。布鲁诺是正确的完全压缩,当我使用他们,我得到了非常小的减少大小。此外,我还考虑过使用您建议的常规Java压缩,但最后我们将生成的文档存储在文件系统中,不需要压缩图像。再次感谢您的回答。您把布鲁诺和乔里斯弄糊涂了。:)@阿梅迪:我希望不要太困惑:))
    PdfWriter writer = new PdfWriter(dest,
        new WriterProperties().setFullCompressionMode(true));