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

时间:2018-05-08 19:35:26

标签: java pdf itext pdfbox image-compression

我有几种操作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不起作用。

1 个答案:

答案 0 :(得分:1)

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

请允许我详细说明。

通常,PDF包含观看者的说明。 类似的东西:

  • 转到坐标50,50
  • 将字体设置为Helvetica,大小为12
  • 绘制字符&#39; H&#39;
  • 的字形

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

为每个对象分配一个数字。这些是XREF中的数字。

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

您的PDF只包含1张图片。

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

你能做什么:

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