首页 > 解决方案 > 在没有 X-Object 的情况下压缩 PDF

问题描述

我有几种方法来处理我的 PDF 文件,例如将它们转换为 .jpg 图像以进行压缩。现在,我有一个没有 X-Object 的 pdf 文件,也就是说,我无法将其转换为 jpg 来压缩它们。然后我决定抓取整个 pdf 文件并尝试一些方法来压缩它,我尝试使用 iText Stamper 和 pdfBox.addCompression(已弃用),但到目前为止没有一个工作。跟随:

    public static byte[] compressPdf(final byte[] imageBytes) {
    try (ByteArrayOutputStream out = new ByteArrayOutputStream()){

        final PdfReader reader = new PdfReader(imageBytes);
        final PdfStamper stamper = new PdfStamper(reader, out, PdfWriter.VERSION_1_7);

        stamper.getWriter().setFullCompression();
        stamper.getWriter().setCompressionLevel(9);

        int total = reader.getNumberOfPages() + 1;
        for (int i = 1; i < total; i++) {
            reader.setPageContent(i, reader.getPageContent(i));
        }

        stamper.close();
        reader.close();

        return out.toByteArray();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

请注意,stamper.fullcompression 或 stamper.setcompressionlevel 不起作用。

标签: javapdfitextpdfboximage-compression

解决方案


您显示的 PDF 文档只是图像的包装。

请允许我详细说明。

通常,PDF 包含对查看器的说明。就像是:

  • 转到坐标 50, 50
  • 将字体设置为 Helvetica,大小 12
  • 绘制字符“H”的字形
  • ETC

这些指令被收集到对象中。同样,他们使用的资源(如图像、字体等)也被分组到对象中。

每个对象都被分配了一个编号。这些是 XREF 中的数字。

当 iText 尝试应用压缩时,它会寻找对象流(即指令流和字体等)并尝试压缩它们。

您的 PDF 仅包含 1 张图片。

iText 不会压缩您的图像(因为这可能会导致质量下降)。

你可以做什么:

  • 不要使用扫描的文档,使用“真实”的 PDF 文档(您的最终用户将不胜感激)
  • 从 PDF 中提取图像(使用 iText),压缩图像(使用图像处理库),将图像重新插入资源中。

推荐阅读