java - 在没有 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 不起作用。
解决方案
您显示的 PDF 文档只是图像的包装。
请允许我详细说明。
通常,PDF 包含对查看器的说明。就像是:
- 转到坐标 50, 50
- 将字体设置为 Helvetica,大小 12
- 绘制字符“H”的字形
- ETC
这些指令被收集到对象中。同样,他们使用的资源(如图像、字体等)也被分组到对象中。
每个对象都被分配了一个编号。这些是 XREF 中的数字。
当 iText 尝试应用压缩时,它会寻找对象流(即指令流和字体等)并尝试压缩它们。
您的 PDF 仅包含 1 张图片。
iText 不会压缩您的图像(因为这可能会导致质量下降)。
你可以做什么:
- 不要使用扫描的文档,使用“真实”的 PDF 文档(您的最终用户将不胜感激)
- 从 PDF 中提取图像(使用 iText),压缩图像(使用图像处理库),将图像重新插入资源中。
推荐阅读
- javascript - Next.JS “Link” vs “router.push()” vs “a” 标签
- gnuplot - 如何在 gnuplot 5.4 中绘制月份数字?
- javascript - 如何使特定数量的字符改变颜色?
- java - Java中的泛型和反射。课程
- c++ - C++17 -- 将成员变量类型映射到 std::optionals
- go - 如何将 yaml 解析/解组为数据结构
- python - 输出文件到 CSV
- android - 我可以为我的应用启用双通道加速吗?
- git - 合并请求和同步分叉回购
- laravel - 如何使用纬度或经度使 Laravel 像 Facebook 一样登录安全?