如何使用 Python 将 PDF 中的二值图像编码为 JBIG2Decode?

我用 img2pdf 生成 PDF 后,使用 acrobat 压缩,发现文件明显变小,

用编辑器查看发现里面的二值图像从FlateDecode变成了JBIG2Decode

我想知道如何 Python 执行这个编码转换,这样就可以扔掉 Acrobat 了。

阅读 1.9k
1 个回答
新手上路,请多包涵

JBIG2 是一种压缩算法,它能够将二值图像压缩为较小的文件大小。如果想将 PDF 中的二值图像编码为 JBIG2,您可以使用 PyMuPDF 库,该库是一个 Python 接口,用于处理 PDF 文件,用于将 PDF 中的二值图像编码为 JBIG2Decode。

import fitz

# 打开 PDF 文件
doc = fitz.open("input.pdf")

# 遍历页面
for page in doc:
    # 遍历页面上的图像
    for img in page.get_images():
        # 如果图像为二值图像
        if img["colorspace"] == fitz.csindex.Indexed and img["ncolors"] == 2:
            # 将图像编码为 JBIG2
            img_data = page.get_pixmap(alpha=False, clip=img["clip"], matrix=img["mat"])
            jbig_data = fitz.Pixmap.from_data_jbig2(img_data.samples, img_data.width, img_data.height)
            # 将图像替换为 JBIG2 数据
            page.insert_image(img["clip"], pixmap=jbig_data)
            jbig_data.clear()
            
# 保存 PDF 文件
doc.save("output.pdf")
doc.close()

虽然 JBIG2 算法能够大幅度压缩二值图像,但在某些情况下,可能会导致图像质量下降

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏