专栏首页机器视觉CVPDF 的各种操作,我用 Python 来实现(附网站和操作指导)

PDF 的各种操作,我用 Python 来实现(附网站和操作指导)

导言

PDF 处理是日常工作中的常见需求,包括 PDF 合并、删除、提取等。更复杂的任务如:将 PDF 转换成 图像。

下面通过几个简单的例子和一份代码,帮助大家解决上面的需求,操作非常简单。

在文末我会提供一份源码和一个神奇的 PDF 处理网站帮你解决 PDF 处理的烦恼。

PyMuPDF 介绍

为什么使用 Python,那还不是 Python 有着强大的第三方工具包,我们想要的功能兴许就有。

PyMuPDF 就是我们需要的工具,官方文档对他的简介是

PyMuPDF 是针对 MuPDF 的 Python 绑定,它是一个轻量级 PDF 和 XPS 查看器。MuPDF 可以访问 PDF,XPS,OpenXPS,CBZ(漫画书档案),FB2 和 EPUB(电子书)格式的文件。这些是扩展名为.pdf,.xps,.oxps,.cbz,.fb2 或.epub 的文件(因此您可以使用 Python 开发电子书查看器)。

官方文档:https://pymupdf.readthedocs.io/en/latest/intro.html

这里有个细节需要说明的是,Python 的第三方包一般是安装的名称和导入的名称是一样的,比如 numpy 的安装和使用是

pip install numpy # numpy 包的安装

import numpy  # numpy 包的导入

但是对于 PyMuPDF 这个包就不一样了,安装和使用的包名是不一样的,这个是历史遗留下来的原因,知道有这回事就行。

PyMuPDF 的安装是这样子的

pip install PyMuPDF

PyPI 源:https://pypi.org/project/PyMuPDF/

PyMuPDF 的导入是这样子的

import fitz

PDF 各种处理

拆分与提取

拆分与提取 PDF 文件的,使用的是 clean 命令,同时该命令也可以用于文档加密,压缩、删除页面等操作,基本说明如下:

python -m fitz clean -h
usage: fitz clean [-h] [-password PASSWORD]
                [-encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}]
                [-owner OWNER] [-user USER] [-garbage {0,1,2,3,4}]
                [-compress] [-ascii] [-linear] [-permission PERMISSION]
                [-sanitize] [-pretty] [-pages PAGES]
                input output

-------------- optimize PDF or create sub-PDF if pages given --------------

positional arguments:
input                 PDF filename
output                output PDF filename

optional arguments:
-h, --help            show this help message and exit
-password PASSWORD    password
-encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}
                      encryption method
-owner OWNER          owner password
-user USER            user password
-garbage {0,1,2,3,4}  garbage collection level
-compress             compress (deflate) output
-ascii                ASCII encode binary data
-linear               format for fast web display
-permission PERMISSION
                      integer with permission levels
-sanitize             sanitize / clean contents
-pretty               prettify PDF structure
-pages PAGES          output selected pages, format: 1,5-7,50-N

以下命令只需在终端运行即可:

参数:2-N 代表去除第一页

python -m fitz clean -sanitize -pages 2-N F:\视觉工程师必须知道的工业相机50问.pdf F:\去除第一页.pdf

其他功能请自行尝试

提取字体和图像(非 PDF 页面)

将字体或图像从选定的 PDF 页面提取到所需目录,基本说明如下:

python -m fitz extract -h
usage: fitz extract [-h] [-images] [-fonts] [-output OUTPUT] [-password PASSWORD]
                    [-pages PAGES]
                    input

--------------------- extract images and fonts to disk --------------------

positional arguments:
input                 PDF filename

optional arguments:
-h, --help            show this help message and exit
-images               extract images
-fonts                extract fonts
-output OUTPUT        output directory, defaults to current
-password PASSWORD    password
-pages PAGES          only consider these pages, format: 1,5-7,50-N

视觉工程师必须知道的工业相机50问.pdf 文件中的图片和字体提取到 提取结果 文件夹中

python -m fitz extract -images -fonts -output F:\提取结果 F:\视觉工程师必须知道的工业相机50问.pdf
saved 9 fonts to 'F:\提取结果'
saved 6 images to 'F:\提取结果'

合并多份文档

合并多份 PDF 文档,使用的是 join 命令,可以指定页面进行合并,同时需要关注 PDF 是否需要密码才能打开,基本说明如下:

python -m fitz join -h
usage: fitz join [-h] -output OUTPUT [input [input ...]]

---------------------------- join PDF documents ---------------------------

positional arguments:
input           input filenames

optional arguments:
-h, --help      show this help message and exit
-output OUTPUT  output filename

specify each input as 'filename[,password[,pages]]'

以下命令只需在终端运行即可:合并两份文档的全部

python -m fitz join -output "F:\合并两份文档.pdf" "F:\视觉工程师必须知道的工业相机50问.pdf" "F:\Modern CMake文档.pdf"

合并两份文档的部分,选择 视觉工程师必须知道的工业相机50问 文件的第一页和 Modern CMake文档.pdf 的 5 到最后一页进行合并,下面语句中有两个 ,, 是因为要合并的文档不需要密码,如果需要密码,就把两个逗号替换成 密码即可。

  • 5-N 代表第五页开始到文档的末尾
python -m fitz join -output F:\合并两份文档.pdf F:\视觉工程师必须知道的工业相机50问.pdf,,1 "F:\Modern CMake文档.pdf",,5-N

PDF 转换成图片

这个功能没办法像上面那样一个命令就能解决,不过通过查看文档,我们也不难写出代码

import sys, fitz, os, datetime

def pyMuPDF_fitz(pdfPath, imagePath):
    startTime_pdf2img = datetime.datetime.now()#开始时间

    print("imagePath="+imagePath)
    pdfDoc = fitz.open(pdfPath) # 打开文件
    for pg in range(pdfDoc.pageCount): # 遍历所有页面
        page = pdfDoc[pg]
        rotate = int(0) # 页面旋转角度
        # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
        # 此处若是不做设置,默认图片大小为:792X612, dpi=96
        zoom_x = 1.33333333 #(1.33333333-->1056x816)   (2-->1584x1224)
        zoom_y = 1.33333333
        mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pix = page.getPixmap(matrix=mat, alpha=False)

        if not os.path.exists(imagePath):#判断存放图片的文件夹是否存在
            os.makedirs(imagePath) # 若图片文件夹不存在就创建

        pix.writePNG(imagePath+'/'+'images_%s.png' % pg)#将图片写入指定的文件夹内

    endTime_pdf2img = datetime.datetime.now()#结束时间
    print('pdf2img时间=',(endTime_pdf2img - startTime_pdf2img).seconds)

if __name__ == "__main__":
    pdfPath = './视觉工程师必须知道的工业相机50问.pdf'
    imagePath = './提取结果'
    pyMuPDF_fitz(pdfPath, imagePath)

旋转 10 度的结果

神奇的网站明天再放出,哈哈哈~~~

以上就是 PDF 处理的几个常用功能,希望能够帮到你,喜欢的朋友感谢三连~~~

参考:

  • https://pymupdf.readthedocs.io/en/latest/index.html
  • https://www.jianshu.com/p/f57cc64b9f5e

本文分享自微信公众号 - 机器视觉CV(AIandCV),作者:Leong

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在线免费无限制的 PDF 处理工具(转换、编辑、分割、合并、压缩)

    SmallPDF 是一个功能一应俱全、简单好用的线上 PDF 处理工具。主要的大类功能包括转档 & 压缩、分割 & 合并、检视 & 编辑、签署等。分为收费和免费...

    机器视觉CV
  • 推荐几款不错的写作利器

    同时我自己搭建了一个博客,其中一个模块是我常用的软件或者工具,后续还会陆续更新。地址是:https://flyinglsj.github.io

    机器视觉CV
  • Beautiful Soup与运用(猫眼电影榜单)

    Beautiful Soup是Python的一个HTML/XML的解析库,可以用来获取网页信息 输入文档为Unicode 编码,输出文档为UTF-8编码,不需考...

    机器视觉CV
  • 触类旁通Elasticsearch:关联

    ES本身不支持SQL数据库的join操作,在ES中定义关系的方法有对象类型、嵌套文档、父子关系和反规范化。

    用户1148526
  • 通过css设置滚动条样式

    在移动端通常情况下滚动条是不显示出来,这样会让一些不明就里的人不知道是否可以滑动查看更多的信息,通过css可以来设置滚动条的样式,并且让它一直显示出来。

    无邪Z
  • Elasticsearch(二) 文档关系分析

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    张凝可
  • python文档之查看帮助文档方法

    使用time模块,使用time模块的localtime函数,使用range类 在已经分清模块,函数,类的情况下开始测试

    py3study
  • Python 提取dict转换为xml/

    py3study
  • 问题小记

    冒泡和捕获: 当addEventListener的第三个参数为true的时候,代表是在捕获阶段绑定;当第三个参数为false或者为空的时候,代表在冒泡阶段绑定

    Tiffany_c4df
  • 【前端】HTML标签

    本文主要在初学HTML时,对常用标签做一些记录。主要是标签的使用,以及效果展示。目的在于有个大概的认识:有什么标签?能做什么?

    Gavin-ZYX

扫码关注云+社区

领取腾讯云代金券