用python将一个扫描pdf文件改成二值图片组成的pdf文件
使用墨水屏读书现在似乎越来越流行,这确实有一定的好处,例如基本不发热,电池续航时间超长,基本不能游戏所以有利于沉浸式阅读,还有不知道是不是真的有用的所谓防蓝光伤害。但是,如果阅读的书籍是扫描图片组成的pdf,如果扫描的时候用的彩色模式,那么这种书籍在墨水屏上有点灰蒙蒙的,如果转换为256级灰度图片时最高灰度值太低,更加难以看清,这时候就可以考虑将这个pdf文件转换成二值图片(即每个像素不是白色就是纯黑的黑色)组成的pdf,这样效果就很好了。
先看看在PC上两种不同pdf文件的效果对比:
转换后的二值图片pdf效果:
转换前的效果:
尽管在非黑白墨水屏的设备上彩色pdf文件读起来更舒适,但是在黑白墨水屏上却刚好相反。下面的python程序就可以实现上述效果的转换(程序注释中标明的库的版本是本人测试环境中的版本,并非必须。其他版本可能也能够成功运行):
###############################################################
# 将彩色或灰度扫描pdf文件转换为二值的黑白pdf文件,在墨水屏上阅读时更为清晰 #
###############################################################
import fitz # pip install pymupdf==1.24.14
import numpy as np # pip install numpy==2.1.1
from PIL import Image # pip install pillow==10.4.0
file = 'test.pdf'
pdf_pages = fitz.open(file)
img_list = []
try:
for page in pdf_pages:
# 获取页面的图片数据,类型为fitz.Pixmap
pixmap = page.get_pixmap()
# 解码为 np.uint8类型的np.array
image_array = np.frombuffer(pixmap.samples, dtype=np.uint8).reshape(pixmap.height, pixmap.width, pixmap.n)
# 转换为pillow.Image
image = Image.fromarray(image_array)
# 将彩色图片转换为黑白图片
image = image.convert('L')
# 获取图片的像素数据
pixels = image.load()
# 获取图片的宽度和高度
width, height = image.size
# 设定阈值,可根据实际情况调整
threshold = 198
# 遍历每个像素点进行二值化处理
for y in range(height):
for x in range(width):
# 获取当前像素的灰度值
gray_value = pixels[x, y]
# 小于阈值的像素点改成黑色,大于阈值的像素点改成白色
if gray_value < threshold:
pixels[x, y] = 0
else:
pixels[x, y] = 255
# 将转换的二值图片加入列表
img_list.append(image)
# 使用pillow库的Image另存为pdf文件功能将二值图片合并为一个pdf文件。resolution决定了页面大小
img_list[0].save('test_threshold.pdf',"PDF", resolution=60.0, save_all=True, append_images=img_list[1:])
except Exception as e:
print(e)
pdf_pages.close()
原文地址:https://blog.csdn.net/yivifu/article/details/143983328
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!