我有几种操作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不起作用。
答案 0 :(得分:1)
您正在显示的PDF文档只是图像的包装。
请允许我详细说明。
通常,PDF包含观看者的说明。 类似的东西:
这些说明被收集到对象中。同样,他们使用的资源(如图像,字体等)也被分组到对象中。
为每个对象分配一个数字。这些是XREF中的数字。
当iText尝试应用压缩时,它将寻找对象流(所以指令和字体流等)并尝试压缩它们。
您的PDF只包含1张图片。
iText不会压缩您的图像(因为这可能会导致质量下降)。
你能做什么: