使用 iText7 压缩生成的 PDF 的最佳实践
Best practice to compress generated PDF using iText7
我有现有的/源 PDF 源文档,我从中复制选定的页面并使用选定的页面生成目标 PDF。现有/源文档中的每一页都以不同的分辨率扫描,并且大小不同:
- 生成的文档有 4 页 => 175 kb
- 生成的文档有 4 页 => 923 kb(我想这是因为源文档中每一页的扫描分辨率更高)
压缩此页面的最佳做法是什么?
是否有任何代码示例可以压缩/减小最终 PDF 的大小,其中包含不同分辨率的源文档的复制页面?
最诚挚的问候
如果您只是将扫描件添加到 pdf 文档,如果您使用的是高分辨率图像,则生成的文档的大小会增加。
请记住,iText 是一个 pdf 库。不是图像处理库。
您当然可以使用常规的旧 java 来尝试压缩图像。
public static void writeJPG(BufferedImage bufferedImage, OutputStream outputStream, float quality) throws IOException
{
Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter imageWriter = iterator.next();
ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
imageWriteParam.setCompressionQuality(quality);
ImageOutputStream imageOutputStream = new MemoryCacheImageOutputStream(outputStream);
imageWriter.setOutput(imageOutputStream);
IIOImage iioimage = new IIOImage(bufferedImage, null, null);
imageWriter.write(null, iioimage, imageWriteParam);
imageOutputStream.flush();
}
但实际上,将扫描的图像放入 pdf 中会让生活变得更加困难。想象一下必须在您之后处理该文档的人员。他们打开它,查看文字,尝试 select 它,但没有任何反应。
此外,您可以在创建 PdfWriter
实例时更改 WriterProperties
:
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().setFullCompressionMode(true));
完全压缩模式会将某些对象压缩到对象流中,它还会压缩 PDF 的交叉引用table。由于文档中的大部分对象都是图像(已经压缩),因此压缩对象不会有太大影响,但如果您有大量页面,则压缩交叉引用 table 可能会导致较小的 PDF 文件。
我有现有的/源 PDF 源文档,我从中复制选定的页面并使用选定的页面生成目标 PDF。现有/源文档中的每一页都以不同的分辨率扫描,并且大小不同:
- 生成的文档有 4 页 => 175 kb
- 生成的文档有 4 页 => 923 kb(我想这是因为源文档中每一页的扫描分辨率更高)
压缩此页面的最佳做法是什么? 是否有任何代码示例可以压缩/减小最终 PDF 的大小,其中包含不同分辨率的源文档的复制页面?
最诚挚的问候
如果您只是将扫描件添加到 pdf 文档,如果您使用的是高分辨率图像,则生成的文档的大小会增加。
请记住,iText 是一个 pdf 库。不是图像处理库。
您当然可以使用常规的旧 java 来尝试压缩图像。
public static void writeJPG(BufferedImage bufferedImage, OutputStream outputStream, float quality) throws IOException
{
Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter imageWriter = iterator.next();
ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
imageWriteParam.setCompressionQuality(quality);
ImageOutputStream imageOutputStream = new MemoryCacheImageOutputStream(outputStream);
imageWriter.setOutput(imageOutputStream);
IIOImage iioimage = new IIOImage(bufferedImage, null, null);
imageWriter.write(null, iioimage, imageWriteParam);
imageOutputStream.flush();
}
但实际上,将扫描的图像放入 pdf 中会让生活变得更加困难。想象一下必须在您之后处理该文档的人员。他们打开它,查看文字,尝试 select 它,但没有任何反应。
此外,您可以在创建 PdfWriter
实例时更改 WriterProperties
:
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().setFullCompressionMode(true));
完全压缩模式会将某些对象压缩到对象流中,它还会压缩 PDF 的交叉引用table。由于文档中的大部分对象都是图像(已经压缩),因此压缩对象不会有太大影响,但如果您有大量页面,则压缩交叉引用 table 可能会导致较小的 PDF 文件。