用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()
相关文章:
用python将一个扫描pdf文件改成二值图片组成的pdf文件
使用墨水屏读书现在似乎越来越流行,这确实有一定的好处,例如基本不发热,电池续航时间超长,基本不能游戏所以有利于沉浸式阅读,还有不知道是不是真的有用的所谓防蓝光伤害。但是,如果阅读的书籍是扫描图片组…...
Failed to start Docker Application Container Engine
说明: 1)访问应用业务,读取不到数据,show databases;查看数据库报错 2)重启docker服务,服务启动失败,查看日志报错如下图所示 3)报错信息:chmod /data/docker: read-only…...
ESLint的简单使用(js,ts,vue)
一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范(命名,格式等) 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法,而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…...
实景三维赋能国土空间智慧治理
随着城市化进程的不断推进,国土空间的合理规划与高效管理成为政府面临的一项重大挑战。在这个过程中,实景三维技术作为一种新兴的信息技术手段,正在逐渐改变传统国土空间治理的方式,为智慧城市的建设提供了新的可能。本文旨在探讨…...
树链剖分(重链剖分)
树链剖分的核心思想就是将一棵树剖分成一条一条的链 因为树不好处理 但链比较好处理 为了学会它 我们先要学会树上dfs(深度优先搜索) 然后就没了(雾) Because 树链剖分需要用到两个dfs 哦对了 我们还要了解以下的知识点 1.子…...
幻读是什么?用什么隔离级别可以防止幻读?
幻读是什么? 幻读(Phantom Read) 是数据库事务中的一种现象,指的是在一个事务中,当执行两次相同的查询时,第二次查询返回的结果集包含了第一次查询中不存在的行,或者第一次查询中存在的行在第二…...
[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…...
智能安全配电装置在高校实验室中的应用
摘要:高校实验室是科研人员进行科学研究和实验的场所,通常会涉及到大量的仪器设备和电气设备。电气设备的使用不当或者维护不周可能会引发火灾事故。本文将以一起实验室电气火灾事故为例,对事故原因、危害程度以及防范措施进行分析和总结…...
网络安全等级保护测评机构管理办法(全文)
网络安全等级保护测评机构管理办法(公信安〔2018〕765号) 第一章 总则 第一条 为加强网络安全等级保护测评机构(以下简称“测评机构”)管理,规范测评行为,提高等级测评能力和服务水平,根据《中华人民共和国网络安全法…...
Flutter:shared_preferences数据存储,数据持久化,token等信息存储
官方示例:简单调用 // 初始化示例 final SharedPreferences prefs await SharedPreferences.getInstance(); // 存int await prefs.setInt(counter, 10); // 存bool await prefs.setBool(repeat, true); // 存double await prefs.setDouble(decimal, 1.5); // 存st…...
FileProvider高版本使用,跨进程传输文件
高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…...
python学习记录18
1 函数的定义 python中的函数指使用某个定义好的名字指代一段完整的代码,在使用名字时可以直接调用整个代码,这个名字叫做函数名。利用函数可以达到编写一次即可多次调用的操作,从而减少代码量。 函数分为内置函数与自定义函数。内置函数例…...
云原生之k8s服务管理
文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度:…...
redis工程实战介绍(含面试题)
文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * ,fl…...
再次讨论下孤注一掷
在孤注一掷中的黑客技术里面,简单介绍了电影孤注一掷中用的一些"黑科技",这里继续讨论下,抛弃这些黑科技,即使在绝对公平的情况下,你也一样赢不了赌场 相对论有一个假设就是光速不变,这里也有个…...
LeetCode46.全排列
LeetCode刷题记录 文章目录 📜题目描述💡解题思路⌨C代码 📜题目描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例1 输入:nums [1,2,3] 输出:[[1,2,…...
蓝桥杯-洛谷刷题-day4(C++)
目录 1.高精度乘法 i.P1303 A*B Problem高精度乘法 2.P4924 [1007] 魔法少女小Scarlet i.题目 ii.代码 3.二维数组 i.二维数组的建立 ii.备份 iii.二维数组的转动 4.指令的及时处理 1.高精度乘法 即,将每一位变为数组中的一位,并在数组中以倒序排列&a…...
c++总复习
1. C 中的移动语义及其作用 定义 移动语义是 C 11 引入的一种重要特性,它用于优化对象的资源管理,特别是在涉及对象所有权转移的场景中。传统的 C 语义在对象赋值或传递给函数时,通常会进行拷贝操作,即创建源对象的一个完整副本&…...
设计模式之策略模式-工作实战总结与实现
文章目录 应用场景存在问题解决方案继续延伸 应用场景 假设有这样的业务场景,大数据系统把文件推送过来,根据不同类型采取不同的解析方式。多数的小伙伴就会写出以下的代码: public class Question {public static void main(String[] args…...
E - 11/22 Subsequence题解
文章目录 大致思路代码 大致思路 预处理: 用pos1, pos2, posls 分别记录 1 1 1, 2 2 2 , / / / 在字符串中的『位置』 用cum1 和 cum2 分别存储了 1 1 1 和 2 2 2 的前缀和,这样可以快速获取任意区间内的 1 1 1 和 2 2 2 的『数量』 查询处理: 对于每个查询…...
为什么选择Marginalia:与Rails 7内置QueryLogs的对比分析
为什么选择Marginalia:与Rails 7内置QueryLogs的对比分析 【免费下载链接】marginalia Attach comments to ActiveRecords SQL queries 项目地址: https://gitcode.com/gh_mirrors/ma/marginalia Marginalia是一款强大的Ruby gem工具,能够为Activ…...
用LLM嵌入向量破解工业微缺陷检测的长尾难题
1. 项目概述:当大模型“看走眼”时,我们该怎么教它识别那些几乎看不见的异常?你有没有遇到过这样的情况:一个工业质检系统,对明显划痕、缺料、锈蚀这类“教科书式”缺陷识别率高达99%,可一旦面对0.3毫米宽的…...
Mythos骨架式推理:企业级AI能力治理与因果建模新范式
1. 项目概述:一次被刻意“锁住”的能力跃迁如果你最近关注大模型前沿动态,大概率已经看到“Anthropic Mythos”这个词在技术圈悄然升温。它不是某个新发布的开源模型,也不是某家创业公司的秘密武器,而是Anthropic内部代号为Mythos…...
Unity IL2CPP逆向实战:用frida-il2cpp-bridge穿透三重运行时屏障
1. 这不是“又一个 Frida 教程”,而是 Unity 逆向现场的生存手册 你刚在某款热门 Unity 游戏里发现一个可疑的加密逻辑,想确认它是否调用了 UnityEngine.PlayerPrefs.SetString 存储敏感 token;或者你在调试一款国产工具类 App,…...
Unity Crest海洋系统跨渲染管线适配指南:BIRP/URP/HDRP深度解析
1. 这不是“换个Shader就能跑”的事:Crest海洋系统在现代Unity管线中的真实适配困境Crest海洋系统——这个在Unity生态里被反复提及、被无数海景Demo反复验证的高质量水体解决方案,从诞生之初就带着一个隐性前提:它原生构建于Built-in Render…...
2026免费在线去水印软件推荐:优缺点对比与测评
在2026年,处理带有水印的图片、视频和文档已经成为许多人日常工作中的常见需求。无论是内容创作者、自媒体运营者,还是普通用户,偶尔都需要从素材中移除水印。本文将全面介绍当前免费在线去水印软件的最新情况,帮助你了解各工具的…...
终极指南:免费开源的AMD Ryzen调试神器SMUDebugTool完整使用教程
终极指南:免费开源的AMD Ryzen调试神器SMUDebugTool完整使用教程 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: …...
Minecraft性能监控终极指南:如何用Spark快速诊断服务器卡顿
Minecraft性能监控终极指南:如何用Spark快速诊断服务器卡顿 【免费下载链接】spark A performance profiler for Minecraft clients, servers, and proxies. 项目地址: https://gitcode.com/gh_mirrors/spark6/spark Minecraft服务器性能优化一直是管理员面临…...
如何在5分钟内掌握DistroAV网络视频传输:新手完整指南
如何在5分钟内掌握DistroAV网络视频传输:新手完整指南 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi 还在为复杂的直播布线烦恼吗?想要在不同设备…...
0601光刻机 第六篇:EUV超精密光学系统(S级 长期死磕突破)第1小节:光学物镜核心原理
第六篇:EUV超精密光学系统(S级 长期死磕突破) 第1小节:光学物镜核心原理(硬核无水分,从物理本质到工程实现) 前置硬核声明 EUV物镜是光刻机的“原子级眼睛”,13.5nm波长决定透射方案…...
