当前位置: 首页 > news >正文

用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.0file = 'test.pdf'
pdf_pages = fitz.open(file)
img_list = []
# 二值化阈值,可根据实际情况调整
threshold = 200
try:for page in pdf_pages:# 获取页面的图片数据,类型为pymupdf.Pixmappixmap = page.get_pixmap()# 解码为 np.uint8类型的numpy.ndarrayimage_array = np.frombuffer(pixmap.samples, dtype=np.uint8).reshape(pixmap.height, pixmap.width, pixmap.n)# 转换为PIL.Image.Image,通过三行代码将pymupdf.Pixmap转换成了PIL.Image.Imageimage = Image.fromarray(image_array)# 将彩色图片转换为黑白图片image = image.convert('L')# 获取图片的像素数据pixels = image.load()# 获取图片的宽度和高度width, height = image.size# 遍历每个像素点进行二值化处理for y in range(height):for x in range(width):# 获取当前像素的灰度值gray_value = pixels[x, y]# 小于阈值的像素点改成黑色,大于阈值的像素点改成白色if gray_value < threshold:pixels[x, y] = 0else:pixels[x, y] = 255# 将转换的二值图片加入列表img_list.append(image)# 将图片列表合并为一个pdf文件,resolution取值越大,pdf文件页面就可以放大更多倍数而不出现锯齿img_list[0].save(f'test_{threshold}.pdf','PDF', resolution=100.0,save_all=True, append_images=img_list[1:])
except Exception as e:print(e)
pdf_pages.close()

http://www.lryc.cn/news/489551.html

相关文章:

  • Failed to start Docker Application Container Engine
  • ESLint的简单使用(js,ts,vue)
  • 实景三维赋能国土空间智慧治理
  • 树链剖分(重链剖分)
  • 幻读是什么?用什么隔离级别可以防止幻读?
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas
  • 智能安全配电装置在高校实验室中的应用
  • 网络安全等级保护测评机构管理办法(全文)
  • Flutter:shared_preferences数据存储,数据持久化,token等信息存储
  • FileProvider高版本使用,跨进程传输文件
  • python学习记录18
  • 云原生之k8s服务管理
  • redis工程实战介绍(含面试题)
  • 再次讨论下孤注一掷
  • LeetCode46.全排列
  • 蓝桥杯-洛谷刷题-day4(C++)
  • c++总复习
  • 设计模式之策略模式-工作实战总结与实现
  • E - 11/22 Subsequence题解
  • PyPI 攻击:ChatGPT、Claude 模仿者通过 Python 库传播 JarkaStealer
  • 单片机学习笔记 9. 8×8LED点阵屏
  • 【大模型-智能体】AutoGen Studio测试和导出工作流程
  • 【Linux】-学习笔记04
  • 计算机网络:应用层知识点概述及习题
  • 如何构建高效的接口自动化测试框架?
  • 【C++习题】10.反转字符串中的单词 lll
  • undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12 问题解决
  • C语言——数组逐元素操作练习
  • HTML的自动定义倒计时,这个配色存一下
  • CUDA补充笔记