在没有 X-Object 的情况下压缩 PDF

Compressing PDF without X-Object

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

    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 不工作。

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

请允许我详细说明。

通常,PDF 包含供查看者使用的说明。 类似于:

  • 转到坐标 50、50
  • 将字体设置为 Helvetica,大小 12
  • 绘制字符的字形 'H'
  • 等等

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

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

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

您的 PDF 仅包含 1 张图片。

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

你能做什么:

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