PDF转图片的思路思考
记录时间:2022年9月1日
PDF转图片库的使用和扩展
python有几个开源的免费的处理Pdf的库,甚至有的已经有很完善的功能了。我发挥一下自己的所学,看看能不能把它变为可用的一程序。
首先是了解PDF处理库PyMupdf,这个库得到路径之后普就可以对pdf文件进行处理,那么我要做的就是提供这一个文件的路径和输出的位置以及输出的一些设置,命名之类的。这个库安装可以使用pip也可以在pycharm的插件里找。
plaintext
1 | pip install PyMuPDF |
读取路径
那么首先就让用户输入路径,我们使用os.listdir(path)来获取文件和文件夹的列表,这是不包括子文件夹内的,咱们暂时不考虑子文件夹内的,毕竟写完一个文件夹只要来一个递归内部文件夹也就是小菜一碟。当然在这一切之前要准备好我们要调用的库:
plaintext
1 2 | import os import fitz |
判断文件或文件夹
我们只对文件做处理,使用os.path.isdir(path)或者os.path.isfile(path)就可以判断文件或者文件夹了。注意这里的path参数要嘛是相对于py文件的相对路径,要么就是绝对路径,仅给出文件名或者文件夹名称是无法得到正确结果的,会全部返回false;
读取文件
读取pdf文件的流程和方法,首先找到pdf文件,读取PDF文件的元数据乃至于页面,对每个页面进行操作,再进行保存。
找到pdf很简单,之前已经用os.listdir方法获得了文件列表并判断哪些是文件,那么对属于文件的那些加入一个列表,再进行后缀名的判断即可。这里使用:
plaintext
1 | os.path.splitext(filename)[1] |
这个方法会将filename分成两个部分,使用下标读取属于后缀名那一部分。判断这一部分是否为.pdf就号,这里记录文件原本的文件名,在后续输出结果重命名时会起作用。
那么判断为pdf文件之后就要进行操作。
打开文档是进行一切操作的基础:这里我们使用fitz.open(filename)方法来打开一个文档,同样必须是一个路径,能让程序找到的路径。将打开文档返回值赋予一个变量,即得到文档对象。
plaintext
1 | doc=fitz.open(filename) |
这时的文档对象具有一系列方法与属性:
plaintext
1 2 3 4 5 | doc.page_count #页数 doc.metadata #元数据 doc.get_toc() # 获取目录 doc.load_page(pno) #读取指定页面 #doc[pno] #读取页面的另一种方法 |
元数据为一个充满描述数据的字典也就是键值对集合,和我们的主题关系不大我们暂且不谈。获取目标目录或者说目标大纲也并非必要,让我们进入pdf转图片最重要的一节:页面的处理。
操作页面
必须先从文档对象里提取出页面才能进行操作,提取页面可以用:
plaintext
1 2 | doc.load_page(pno) #读取指定页面 #doc[pno] #读取页面的另一种方法 |
这两个方法是一样的,都是按页码获取页面甚至可以倒序进行。
当然了还有更高级的用法,将文档作为页面的迭代器:
plaintext
1 2 3 4 5 6 7 8 9 10 | for page in doc:# do something with 'page'# ... or read backwards for page in reversed(doc):# do something with 'page'# ... or even use 'slicing' for page in doc.pages(start, stop, step):# do something with 'page' |
那么获取了页面之后具体做什么操作呢?
plaintext
1 2 3 4 5 6 7 8 9 10 | links=page.get_links() #获取页面所有链接 for link in page.links(): #do sth #这里是作为迭代器使用 #注释与表单同理 for annot in page.annots():# do something with 'annot'for field in page.widgets():# do something with 'field' |
我们这里要进行的最重要的操作是得到页面的图像
plaintext
1 | pix = page.get_pixmap() |
这个方法得到页面的RGB图像,还有很多可以设定的参数:
plaintext
1 2 | #创建RGBA图像(即,包含alpha通道),也就是包含透明度通道 pix=page.get_pixmap(alpha=True) |
关于get_pixmap()
方法:
plaintext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 如何提高图像分辨率 文档页面的图像由像素映射表示,创建像素映射的最简单方法是通过方法 Page.get_pixmap()。此方法有许多选项可以影响结果。其中最重要的是矩阵,它可以让你缩放,旋转,扭曲或镜像结果。默认情况下Page.get_pixmap() 将使用单位矩阵,它不执行任何操作。在下文中,我们将缩放系数 2 应用于每个维度,这将生成分辨率高 4 倍(也是大小约 4 倍)的图像:zoom_x = 2.0 # horizontal zoom zoom_y = 2.0 # vertical zoom mat = fitz.Matrix(zoom_x, zoom_y) # zoom factor 2 in each dimension pix = page.get_pixmap(matrix=mat) # use 'mat' instead of the identity matrix 从版本 1.19.2 开始,有一种更直接的方法来设置分辨率:可以使用参数(每英寸点数)代替 。要创建页面的 300 dpi 图像,请指定 。除了符号简洁之外,此方法还具有 dpi 值与图像文件一起保存的额外优点 - 这在使用矩阵表示法时不会自动发生。"dpi""matrix"pix = page.get_pixmap(dpi=300) |
具体的参数可以查阅官方手册,也可以百度资料。
还可以使用page.get_svg_image()
创建页面的矢量图像。
那么得到图像就要保存啊:
plaintext
1 2 | pix.save("page-%i.png" % page.number) #这样就是直接用页面编码命名然后保存在和程序同一个目录下了 |
其他方法例如获取页面文本图像之类的甚至可以搜索文本!但在这里不是重点就是了。
plaintext
1 2 | text = page.get_text(opt) #提取文字(opt为选项) areas = page.search_for("mupdf") #搜索文字 |
那么到这整体流程就清楚了让我们开始程序编写吧!
相关文章:

PDF转图片的思路思考
记录时间:2022年9月1日 PDF转图片库的使用和扩展 python有几个开源的免费的处理Pdf的库,甚至有的已经有很完善的功能了。我发挥一下自己的所学,看看能不能把它变为可用的一程序。 首先是了解PDF处理库PyMupdf,这个库得到路径之后普就可以对…...

lnmp - 登录技术方案设计与实现
概述 登录功能是对于每个动态系统来说都是非常基础的功能,用以区别用户身份、和对应的权限和信息,设计出一套安全的登录方案尤为重要,接下来我介绍一下常见的认证机制的登录设计方案。 方案设计 HTTP 是一种无状态的协议,客户端…...

如何在 Qt 的 QListWidget 中逐行添加和显示数据
文章目录 如何在 Qt 的 QListWidget 中逐行添加和显示数据目标实现步骤1. 在 Qt Designer 中添加 QListWidget2. 在代码中逐行添加数据示例代码 代码解析3. 使用自定义项 运行效果总结 如何在 Qt 的 QListWidget 中逐行添加和显示数据 QListWidget 是 Qt 提供的一个非常方便的…...

Java API 之集合框架进阶
前言: 本文主要讲解集合框架中的List、Set、Map接口中的进阶知识,主要是分析其底层原理和优缺点。 1. List 接口 1.1 ArrayList import java.util.ArrayList; import java.util.List;public class ArrayListExample {public static void main(String[] …...

Java String isEmpty()方法
在Java中,String 类的 isEmpty() 方法用来检测一个字符串是否为空。以下是一些关于此方法的关键信息: 方法声明:public boolean isEmpty()功能:通过检查字符串的长度来判断字符串是否为空。返回值:如果字符串为空则返…...

Redisson分布式锁分析,可重入、可续锁(看门狗)
前言 在此说明,本文章不只是讲一些抽象的概念,而是可落地的,在日常工作中基本上进行修改一下便可以使用。书接上回,上篇自研分布式锁的文章使用是一个自己手写的一个分布式锁,按照JUC里面java.util.concurrent.locks.L…...

C++掉血迷宫
目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好,我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…...

Spring Boot- 数据库相关问题
Spring Boot 与数据库相关问题及其解决方案 1. 引言 Spring Boot简化了Java企业级应用的开发,尤其在与数据库交互方面提供了诸多便利。Spring Boot提供了多种数据库集成方案,涵盖关系型数据库(如MySQL、PostgreSQL等)与非关系型…...

秒懂C++之特殊类设计
目录 设计一个类,不能被拷贝 设计一个类,只能在堆上创建对象 设计一个类,只能在栈上创建对象 设计一个类,无法被继承 设计一个类,只能创建一个对象(单例模式) 饿汉模式 懒汉模式 设计一个类,不能被拷…...

人工智能学习
🌐前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 👉【点击跳转到网站:人工智能教程】 什么是人工智能?通俗来讲,就是让机器能像人一样思考。这…...

WINDOWS AGENTARENA:EVALUATING MULTI-MODAL OS AGENTS AT SCALE论文学习
文章开头说现有的agent都是局限于特定领域(什么网络问答啊,仅限文字啊,仅限于某一个app啊)这样的,本文的工作主打一个贴近用户使用场景,用户用什么软件,看什么网页,本文的模型就用什…...

3步轻松定制报价方案,亿发商城报价神器你用过了吗?
如果您正寻求突破传统业务模式的束缚,希望拥抱数字化转型带来的无限可能,我们诚邀您体验亿发软件。亿发专业团队将为您提供个性化的咨询和定制服务,帮助您的企业快速适应市场变化,实现业务模式和商业模式的创新。...

CISP备考题库(五)
在当今这个飞速发展的数字化时代,信息安全已跃居至前所未有的战略地位,其重要性伴随着技术的日新月异而持续攀升,成为了一个不容小觑的关键领域。为了激发并引领广大青年才俊积极投身于网络安全专家的崇高事业,我们精心策划并编纂…...

【Kubernetes】常见面试题汇总(二十三)
目录 69.考虑一家拥有分布式系统的跨国公司,拥有大量数据中心,虚拟机和许多从事各种任务的员工。您认为这样公司如何以与 Kubernetes 一致的方式管理所有任务? 70.考虑一种情况,即公司希望通过维持最低成本来提高其效率和技术运营…...

linux-Shell 编程-Shell 脚本基础
Linux Shell 编程:Shell 脚本基础 在Linux系统中,Shell脚本是一种强大的自动化工具。通过编写Shell脚本,用户可以自动化重复性任务、系统管理操作和程序控制流程,极大提高工作效率。 1. 什么是Shell脚本? Shell脚本是…...

Linux运维篇-tigervnc工具的使用
目录 简介下载使用clientserver配置文件服务管理 设定密码(先切换成对应的用户):配置多用户的VNC tigervnc连接排错一、vnc密码错误二、vncserver端口忘记了三、连接很卡,或者画面没有反应四、服务报错 简介 TigerVNC是VNC的一种…...

基于Spark的电影推荐系统设计与实现(论文+源码)_kaic
摘 要 在云计算、物联网等技术的带动下,我国已步入大数据时代。电影是人们日常生活中重要的一种娱乐方式,身处大数据时代,各种类型、题材的电影层出不穷,面对琳琅满目的影片,人们常感到眼花缭乱。因此,如…...

基于python+django+vue的医院预约挂号系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…...

镀金引线---
一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式,它们各有优劣势,选择哪种方式取决于具体的应用需求和预算。 沉金(ENIG)是一种常用的金手指处理方式,它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…...

『功能项目』窗口可拖拽脚本【59】
本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目, 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本:DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…...

Map--08--CurrentHashMap 与 Hashtable的异同?
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Map方法computeIfAbsent1.computeIfAbsent 方法的简介2.案例computeIfAbsent() Map方法computeIfAbsent computeIfAbsent方法是Java 8中引入的一种简化操作Map的方…...

Docker学习笔记(三)存储与卷
挂载机制介绍 我们都知道,默认下,Docker容器与宿主机是完全隔离的,这种特性使得我们创建与删除容器都变得更方便,不需要再去删除宿主机上容器遗留下来的痕迹。 但是,当我们使用数据库一类需要持久化数据、共享数据…...

硬件工程师笔试面试——滤波器
目录 12、滤波器 12.1 基础 滤波器原理图 滤波器实物图 12.1.1 概念 12.1.2 滤波器的分类 12.1.3 滤波器的工作原理 12.1.4 滤波器的应用 12.1.5 滤波器设计的关键参数 12.2 相关问题 12.2.1 不同类型的滤波器在实际应用中的具体作用是什么? 12.2.2 如何设计一个简…...

【SpringBoot3】面向切面 AspectJ AOP 使用详解
文章目录 一、AspectJ介绍二、简单使用步骤1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点(Pointcut)1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知࿰…...

wav怎么转mp3格式?给你推荐几种音频格式转换方法
wav怎么转mp3格式?将wav文件转换为MP3格式是一个常见的操作,尤其适用于需要节省存储空间或确保文件兼容性的场景。wav文件保存了音频的所有原始数据,这使得它们的文件体积往往非常庞大。相比之下,MP3格式通过有损压缩技术显著减小…...

Redis的AOF持久化、重写机制、RDB持久化、混合持久化
1、AOF持久化 1.1.AOF持久化大致过程 概括:命令追加(append)、文件写入、文件同步(sync) Redis 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里,然后重启 Redis 的时候&#…...

Dom4j使用xpath查询xml文
Dom4j使用xpath查询带有命名空间的xml文件 方式1 忽略命名空间 DocumentFactory factory DocumentFactory.getInstance(); SAXReader reader new SAXReader(factory); Document document reader.read(xmlFilePath); Element rootElement document.getRootElement(); Nod…...

国家专精特新小巨人企业指标解析与扶持领域
一、什么是国家专精特新小巨人 (一)概念与定义 专精特新“小巨人”企业是指那些在细分市场中具有专业化、精细化、特色化和新颖化特征的中小企业中的佼佼者。这些企业在创新能力强、市场占有率高、掌握关键核心技术以及质量效益方面表现突出࿰…...

进程的属性
tips: task_struct就是linux下的PCB 操作系统不相信任何外部用户,而是只提供窗口,不可能直接与用户打交道,而是通过操作系统 tast_struct用来描述所有进程,用来管理 ; 和 && 可以同时跑两个命令 进…...

Git 中的refs
在 Git 中,refs 是用来存储 Git 对象(如提交、树、标签等)的引用。每个 ref 都是一个指针,指向一个特定的 Git 对象。以下是 Git 中几种常见的 refs 及其含义: 1. refs/heads/ 表示:本地分支。 用途&…...