在没有 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),压缩图像(使用图像处理库),将图像重新插入到资源中。
我有几种方法来处理我的 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),压缩图像(使用图像处理库),将图像重新插入到资源中。