
本文介绍在使用 openpdf 将多页 tiff 转换为 pdf 时,通过启用全压缩模式与采用 ccitt g4 无损压缩图像编码,显著减小输出 pdf 文件体积的核心方法。
本文介绍在使用 openpdf 将多页 tiff 转换为 pdf 时,通过启用全压缩模式与采用 ccitt g4 无损压缩图像编码,显著减小输出 pdf 文件体积的核心方法。
在使用 OpenPDF(原 iText 2.x 分支)将高分辨率多页 TIFF 文档转换为 PDF 时,一个常见痛点是生成的 PDF 文件体积过大——尤其当每页 TIFF 以原始位图方式嵌入时,未压缩的 RGB/BGR 图像数据会急剧膨胀文件尺寸。根本原因在于:默认 Image.getInstance(...) 方法对 TIFF 的处理往往绕过专用压缩,直接封装原始像素流,丧失了 TIFF 自身支持的高效二值压缩(如 CCITT Group 4)优势。
要实质性缩减 PDF 体积,需从图像编码层和PDF 写入层双管齐下:
✅ 1. 启用 PDF 全压缩(Full Compression)
OpenPDF 提供 setFullCompression() 接口,可对整个 PDF 结构(对象流、交叉引用表、字符串、流内容等)启用 ZIP 压缩。务必在文档关闭前、PdfStamper 或 PdfWriter 实例上显式调用:
com.lowagie.text.Document document = new com.lowagie.text.Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
// 关键:启用全压缩
writer.setFullCompression();
writer.setCompressionLevel(PdfStream.BEST_COMPRESSION); // 可选,强化流压缩
document.open();
// ... 添加内容
document.close();
⚠️ 注意:
PdfWriter.setFullCompression()必须在document.open()之后、内容写入之前调用;若使用PdfStamper后处理,也需对其getWriter()调用相同方法。
✅ 2. 使用 CCITT G4 压缩二值图像(推荐用于扫描文档)
对于黑白/灰度扫描件(典型 TIFF),CCITT Group 4 是业界标准的无损二值压缩算法,压缩率远超 PNG/JPEG。OpenPDF 支持直接构造 Image 对象,跳过原始位图封装:
// 假设 pageImage 是已加载的 BufferedImage(类型 TYPE_BYTE_BINARY 或 TYPE_BYTE_GRAY)
BufferedImage pageImage = loadTiffPage(pageNumber);
int width = pageImage.getWidth();
int height = pageImage.getHeight();
// 提取原始字节数组(需确保数据布局兼容 CCITT)
byte[] rawData = ((DataBufferByte) pageImage.getRaster().getDataBuffer()).getData();
// 执行 CCITT G4 压缩(OpenPDF 内置 codec)
byte[] compressedData = CCITTG4Encoder.compress(rawData, width, height);
// 构造压缩后的 Image 实例
Image image = Image.getInstance(
width, height,
false, // reverseBits: 通常 false
Image.CCITTG4, // 指定 CCITT Group 4 编码
0, // parameters(保留 0 即可)
compressedData,
null // transparency(二值图通常无需)
);
document.add(image);
? 提示:确保
pageImage为单通道二值图像(如TYPE_BYTE_BINARY)。若源 TIFF 为灰度或彩色,需先二值化(如 Otsu 阈值),否则 CCITT 压缩无效甚至报错。
? 补充优化建议
-
避免重复压缩:不要对已压缩的 TIFF 文件再次用
Image.getInstance(File)加载——这会解压再粗粒度封装,反而增大体积。 -
慎用 JPEG:虽然
Image.getInstance(..., Image.JPEG)支持有损压缩,但对文字文档易产生模糊;CCITT G4 在保持锐利边缘前提下压缩率更高(典型 10:1~20:1)。 -
验证输出:使用
pdfinfo output.pdf(Poppler 工具)检查Compressed objects和Object stream是否启用,确认压缩生效。
通过组合 PDF 全压缩 + 图像级 CCITT G4 编码,典型扫描文档 PDF 体积可减少 70%–90%,同时完全保持文字可读性与打印精度。这是 OpenPDF 场景下兼顾性能、体积与质量的最佳实践路径。










