pdf转图片的方法思考
PDF转图片库的使用和扩展
python有几个开源的免费的处理Pdf的库,甚至有的已经有很完善的功能了。我发挥一下自己的所学,看看能不能把它变为可用的一程序。
首先是了解PDF处理库PyMupdf,这个库得到路径之后普就可以对pdf文件进行处理,那么我要做的就是提供这一个文件的路径和输出的位置以及输出的一些设置,命名之类的。这个库安装可以使用pip也可以在pycharm的插件里找。
1 | pip install PyMuPDF |
读取路径
那么首先就让用户输入路径,我们使用os.listdir(path)来获取文件和文件夹的列表,这是不包括子文件夹内的,咱们暂时不考虑子文件夹内的,毕竟写完一个文件夹只要来一个递归内部文件夹也就是小菜一碟。当然在这一切之前要准备好我们要调用的库:
1 | import os |
判断文件或文件夹
我们只对文件做处理,使用os.path.isdir(path)或者os.path.isfile(path)就可以判断文件或者文件夹了。注意这里的path参数要嘛是相对于py文件的相对路径,要么就是绝对路径,仅给出文件名或者文件夹名称是无法得到正确结果的,会全部返回false;
读取文件
读取pdf文件的流程和方法,首先找到pdf文件,读取PDF文件的元数据乃至于页面,对每个页面进行操作,再进行保存。
找到pdf很简单,之前已经用os.listdir方法获得了文件列表并判断哪些是文件,那么对属于文件的那些加入一个列表,再进行后缀名的判断即可。这里使用:
1 | os.path.splitext(filename)[1] |
这个方法会将filename分成两个部分,使用下标读取属于后缀名那一部分。判断这一部分是否为.pdf就号,这里记录文件原本的文件名,在后续输出结果重命名时会起作用。
那么判断为pdf文件之后就要进行操作。
打开文档是进行一切操作的基础:这里我们使用fitz.open(filename)方法来打开一个文档,同样必须是一个路径,能让程序找到的路径。将打开文档返回值赋予一个变量,即得到文档对象。
1 | doc=fitz.open(filename) |
这时的文档对象具有一系列方法与属性:
1 | doc.page_count #页数 |
元数据为一个充满描述数据的字典也就是键值对集合,和我们的主题关系不大我们暂且不谈。获取目标目录或者说目标大纲也并非必要,让我们进入pdf转图片最重要的一节:页面的处理。
操作页面
必须先从文档对象里提取出页面才能进行操作,提取页面可以用:
1 | doc.load_page(pno) #读取指定页面 |
这两个方法是一样的,都是按页码获取页面甚至可以倒序进行。
当然了还有更高级的用法,将文档作为页面的迭代器:
1 | for page in doc: |
那么获取了页面之后具体做什么操作呢?
1 | links=page.get_links() #获取页面所有链接 |
我们这里要进行的最重要的操作是得到页面的图像
1 | pix = page.get_pixmap() |
这个方法得到页面的RGB图像,还有很多可以设定的参数:
1 | #创建RGBA图像(即,包含alpha通道),也就是包含透明度通道 |
关于get_pixmap()方法:
1 | 如何提高图像分辨率 |
具体的参数可以查阅官方手册,也可以百度资料。
还可以使用page.get_svg_image()创建页面的矢量图像。
那么得到图像就要保存啊:
1 | pix.save("page-%i.png" % page.number) |
其他方法例如获取页面文本图像之类的甚至可以搜索文本!但在这里不是重点就是了。
1 | text = page.get_text(opt) #提取文字(opt为选项) |
那么到这整体流程就清楚了让我们开始程序编写吧!
实际编码
这部分我将单独写一篇文章啦,不出意料应该就是下一篇!
