【fitz+PIL】PDF图片文字颜色加深

文章目录

    • [0 引言](#0 引言)
    • [1 解决思路及流程](#1 解决思路及流程)
      • [1.1 思路](#1.1 思路)
      • [1.2 代码实现](#1.2 代码实现)
    • [2 完整代码与效果](#2 完整代码与效果)
    • [3 总结](#3 总结)

0 引言

没错,这是连续剧。女友对上一篇【fitz+OpenCV】去除PDF图片中的水印得到的去水印效果很满意,于是问我可不可以再帮她处理一下另一个PDF文件,我二话不说答应了下来。原PDF文件是一本教材的电子版,每页都是一张图片,和上一篇文章中PDF的类型相同,不过本文中需要解决的问题是,原图中文字颜色太浅,看着费眼睛,如下图所示,需要将文字颜色加深。

1 解决思路及流程

1.1 思路

在大致分析了PDF组成后(其中红色的为笔记标注,和页面图片单独存在),这个问题的解决思路也相当明晰了,便是将每页的图片单独提取出来,对图片进行文字加深处理,这里可以通过增加图片对比度实现(对比度就是画面中明暗部分的亮度比,对比度越高,则图像中明暗部分的差异就越大。根据这一原理,将对比度增大后,原本颜色较深的文字部分将会更深,反之,颜色较浅的背景将会更亮)。

1.2 代码实现

在代码方面中,我们依然采用fitzpip install PyMuPDF)作为PDF处理库,图片的处理则是基于图像库PILpip install pillow)。

首先我们打开待处理的PDF文件,对每页进行遍历,提取每页的图片,为了防止个别页面存在多张图片,又嵌套了个for循环以遍历页内图片。

python 复制代码
doc = fitz.open(input_pdf)  # 打开原PDF
for page_num in range(len(doc)):
    # 获取页面图片
    page = doc.load_page(page_num)
    page_imgs = page.get_images()
    for page_img in page_imgs:
        xref = page_img[0]
        img_info = doc.extract_image(xref)
        img = Image.open(io.BytesIO(img_info["image"]))  # 转换为 PIL Image,方便处理

接下来处理每张图片,factor为对比度值,取1函数返回原图像,如果要增加图像对比度,该参数应大于1.0,本文示例中取3.0。

python 复制代码
# 增强图片
enhancer = ImageEnhance.Contrast(img)  # 增强对比度(使文字更清晰)
enhanced_img = enhancer.enhance(factor=contrast)

用增强后的图片替换原图片,这一步仅仅改变了背景图片的信息,不影响前景的笔记标注。其中quality参数用于控制图像的质量,决定图像的体量与清晰度,progressive用于控制是否生成渐进式JPEG,实测该保存方式得到的图片体积更小,dpi参数用于控制图片两个方向的dpi。

python 复制代码
# 替换原图片
bio = io.BytesIO()
enhanced_img.save(bio, format=img_info["ext"], quality=50, progressive=True, dpi=(300, 300))
page.replace_image(xref, stream=bio)

最后一步,在所有页面处理完成后,保存输出处理后的PDF。

python 复制代码
# 保存PDF
doc.save(output_pdf)
doc.close()

2 完整代码与效果

完整代码如下:

python 复制代码
import io
import fitz  # PyMuPDF
from PIL import Image, ImageEnhance


def process_pdf(input_pdf, output_pdf, contrast):
    doc = fitz.open(input_pdf)  # 打开原PDF
    for page_num in range(len(doc)):
        # 获取页面图片
        page = doc.load_page(page_num)
        page_imgs = page.get_images()
        for page_img in page_imgs:
            xref = page_img[0]
            img_info = doc.extract_image(xref)
            img = Image.open(io.BytesIO(img_info["image"]))  # 转换为 PIL Image,方便处理
            # 增强图片
            enhancer = ImageEnhance.Contrast(img)  # 增强对比度(使文字更清晰)
            enhanced_img = enhancer.enhance(factor=contrast)
            # 替换原图片
            bio = io.BytesIO()
            enhanced_img.save(bio, format=img_info["ext"], quality=50, progressive=True, dpi=(300, 300))
            page.replace_image(xref, stream=bio)

    # 保存PDF
    doc.save(output_pdf)
    doc.close()
    print(f"PDF处理完成!输出文件: {output_pdf}")


if __name__ == "__main__":
    input_pdf = 'example.pdf'
    output_pdf = 'output.pdf'
    process_pdf(input_pdf, output_pdf, contrast=3.0)

处理效果如下图所示:

效果还是不错的。

3 总结

该方法和上一篇文章中的方法存在一个共性问题,便是生成的PDF文件体量太大,比原本文件的大了近3~4倍,该问题打算后面有时间研究一下。

相关推荐
zhonyu鱼1 天前
Saber:专为触控笔设计的开源手写笔记与 PDF 批注工具
笔记·pdf·开源
winfredzhang1 天前
用 Python + wxPython 造一个照片工具箱:PDF / 加密ZIP / MP4 / 归档,以及我在这过程中踩到的 4 个坑
python·pdf·zip·mp4·移动
2501_930707781 天前
使用C#代码在 PDF 文档中创建列表
pdf
AI导出鸭2 天前
Claude的LaTeX生成PDF文件复制后数学公式乱码,怎样修改?专业用户首选“AI导出鸭”
人工智能·pdf·ai导出鸭
qyyyyy5703 天前
外文 PDF 怎么整理成 Markdown?从翻译、内容提取到 RAG 知识库导入
自然语言处理·pdf·erlang·机器翻译·零知识证明
AI导出鸭3 天前
Perplexity的LaTeX生成PDF文件复制后数学公式乱码,怎样修改?AI导出鸭苹果版的技术拆解与批量之道
人工智能·pdf·ai导出鸭
SpaceAIGlobal4 天前
AI PPT生成工具哪些支持PDF文档导入?
人工智能·ai·pdf·powerpoint·办公
Xxtaoaooo4 天前
极空间部署Stirling PDF:搭建自托管PDF工具箱并实现远程访问
pdf·cpolar·stirling pdf
SamChan904 天前
对比 4 种主流 PDF 文档解析方案:PyMuPDF vs pdfplumber vs Apache PDFBox vs 大模型 OCR
python·ai·pdf·ocr·apache·机器翻译
AI刀刀5 天前
Kimi 文档导出格式错乱、排版丢失、导出报错?AI 导出鸭一键智能适配,稳定输出规范 Word、PDF,高效解决各类导出难题
人工智能·pdf·word·ai导出鸭