PDF转图片的思路思考

embedded/2024/9/23 7:26:59/

记录时间: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") #搜索文字

那么到这整体流程就清楚了让我们开始程序编写吧!


http://www.ppmy.cn/embedded/115474.html

相关文章

Vulkan 学习(8)---- vkImageView 创建

目录 OverView创建方法关键结构参考代码 OverView Vulkan 的图像视图(VkImageView) 用于描述如何访问 VkImage 对象以及访问图像的哪一部分, 图像视图定义了图像格式和访问方式,允许渲染管线和图像进行交互,无论是作为纹理,颜色附件或者深度…

Elastic 的 OpenTelemetry PHP 发行版简介

作者:Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo 洪涝洪水滑坡灾害数据集 数据集描述 该数据集是一个专门用于检测和识别洪涝、洪水和滑坡等自然灾害的数据集,旨在帮助研究人员和开发者训练和评估基于深度学习的目标检测模型。数据集涵盖了两种常见的自然灾害…

【AI创作组】Matlab绘图基础之plot函数

1. plot函数语法 1.1 基本语法 Matlab中的plot函数是最常用的绘图函数之一,其基本语法如下: plot(X,Y)X和Y可以是向量或矩阵,也可以是两个向量的元素个数相同的数组。当X和Y都是向量时,plot函数将在当前坐标轴上绘制Y对X的图。1.2 线型、颜色和标记 plot函数还允许用户…

c++----io流

提示:以下 是本篇文章正文内容,下面案例可供参考 1.标准io流 (1)数据的循环输入 对于内置类型:cin和cout直接使用,c已经重载了 (2)对于自定义类型: 需要我们自己对类型进行重载 2.文件io流 ifstream ifile(只输入…

【devops】devops-ansible之介绍和基础使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

云盘视频保护神器,支持云盘视频加密与在线播放,配合alist使用,超完美!

平时我们保护视频,一般都是采用压缩工具,进行加密打包,然后在上传到网盘存储。这虽然能起到很好的保护,但是有很多问题?比如:无法直接在线播放,还得从网盘中下载后解压,才能进行观看…

docker 升级步骤

Docker 升级的步骤通常取决于你所使用的操作系统。以下是针对常见操作系统(如 Ubuntu 和 CentOS)的 Docker 升级步骤: Ubuntu 更新现有的包索引: sudo apt-get update 升级 Docker: 您可以运行以下命令来升级 Docker…