Python操作PDF

  • 准备
  • 批量拆分
  • 批量合并
  • 提取文字内容
  • 提取表格内容
  • 提取图片内容
  • 转换为图片

准备

首先,安装PyPDF2pdfplumberPyMuPDFpdf2image模块
pip install PyPDF2 pdfplumber PyMuPDF pdf2image

接着找到utils.py 文件,定位到第 238 行原文,如果你使用的是 anaconda,对应的文件路径应该为:anaconda\Lib\site-packages\PyPDF2\utils.py

安装 poppler for Windows,安装链接是:http://blog.alivate.com.au/poppler-windows/
另外,还需要添加环境变量, 将 bin 文件夹的路径添加到环境变量 PATH 中

原文中是这样的:

 r = s.encode('latin-1')if len(s) < 2:bc[s] = rreturn r

修改为:

try:r = s.encode('latin-1')if len(s) < 2:bc[s] = rreturn r
except Exception as e:r = s.encode('utf-8')if len(s) < 2:bc[s] = rreturn r

批量拆分

def split_pdf(filename, filepath, save_dirpath, step=5):"""拆分PDF为多个小的PDF文件,@param filename:文件名@param filepath:文件路径@param save_dirpath:保存小的PDF的文件路径@param step: 每step间隔的页面生成一个文件,例如step=5,表示0-4页、5-9页...为一个文件@return:"""if not os.path.exists(save_dirpath):os.mkdir(save_dirpath)pdf_reader = PdfFileReader(filepath)# 读取每一页的数据pages = pdf_reader.getNumPages()for page in range(0, pages, step):pdf_writer = PdfFileWriter()# 拆分pdf,每 step 页的拆分为一个文件for index in range(page, page+step):if index < pages:pdf_writer.addPage(pdf_reader.getPage(index))# 保存拆分后的小文件save_path = os.path.join(save_dirpath, filename+str(int(page/step)+1)+'.pdf')print(save_path)with open(save_path, "wb") as out:pdf_writer.write(out)print("文件已成功拆分,保存路径为:"+save_dirpath)
import os
from PyPDF2 import PdfFileWriter,PdfFileReader
import pdfplumberfilename = '易方达中小盘混合型证券投资基金2020年中期报告'
filepath = 'D:\\组团学习\\易方达中小盘混合型证券投资基金2020年中期报告.pdf'
save_dirpath = 'D:\\组团学习\\task04_out'
split_pdf(filename, filepath, save_dirpath)

批量合并

def concat_pdf(filename, read_dirpath, save_filepath):"""合并多个PDF文件@param filename:文件名@param read_dirpath:要合并的PDF目录@param save_filepath:合并后的PDF文件路径@return:"""pdf_writer = PdfFileWriter()# 对文件名进行排序list_filename = os.listdir(read_dirpath)list_filename.sort(key=lambda x: int(x[:-4].replace(filename, "")))for filename in list_filename:print(filename)filepath = os.path.join(read_dirpath, filename)# 读取文件并获取文件的页数pdf_reader = PdfFileReader(filepath)pages = pdf_reader.getNumPages()# 逐页添加for page in range(pages):pdf_writer.addPage(pdf_reader.getPage(page))# 保存合并后的文件with open(save_filepath, "wb") as out:pdf_writer.write(out)print("文件已成功合并,保存路径为:"+save_filepath)
filename = '易方达中小盘混合型证券投资基金2020年中期报告'
read_dirpath = 'D:\\组团学习\\task04_out'
save_filepath = 'D:\\组团学习\\task04_out1.pdf'concat_pdf(filename, read_dirpath, save_filepath)

提取文字内容

def extract_text_info(filepath):"""提取PDF中的文字@param filepath:文件路径@return:"""with pdfplumber.open(filepath) as pdf:# 获取第2页数据page = pdf.pages[1]print(page.extract_text())
filepath = 'D:\\组团学习\\task04_out1.pdf'extract_text_info(filepath)


而如果想要提取所有页的文字,只需要改成:

with pdfplumber.open(filepath) as pdf:# 获取全部数据for page in pdf.pagesprint(page.extract_text())

提取表格内容

def extract_table_info(filepath):"""提取PDF中的图表数据@param filepath:@return:"""with pdfplumber.open(filepath) as pdf:# 获取第18页数据page = pdf.pages[17]# 如果一页有一个表格,设置表格的第一行为表头,其余为数据table_info = page.extract_table()df_table = pd.DataFrame(table_info[1:], columns=table_info[0])df_table.to_csv('D:\\组团学习\\dmeo.csv', index=False, encoding='gbk')
import pandas as pdfilepath = 'D:\\组团学习\\task04_out1.pdf'extract_table_info(filepath)


而如果想要提取该页的每一个表格数据,对应的将 extract_table 函数 改成 extract_tables 即可

# 如果一页有多个表格,对应的数据是一个三维数组
tables_info = page.extract_tables()
for index in range(len(tables_info)):# 设置表格的第一行为表头,其余为数据df_table = pd.DataFrame(tables_info[index][1:], columns=tables_info[index][0])print(df_table)# df_table.to_csv('D:\\组团学习\\dmeo.csv', index=False, encoding='gbk')

提取图片内容

def extract_picture_info(filepath,pic_dirpath):if not os.path.exists(pic_dirpath):os.makedirs(pic_dirpath)# 使用正则表达式来查找图片check_XObject = r"/Type(?= */XObject)"check_Image = r"/Subtype(?= */Image)"img_count = 0"""1. 打开pdf,打印相关信息"""pdf_info = fitz.open(filepath)# 1.16.8版本用法 xref_len = doc._getXrefLength()# 最新版本写法xref_len = pdf_info.xref_length()# 打印PDF的信息print("文件名:{}, 页数: {}, 对象: {}".format(filepath, len(pdf_info), xref_len-1))"""2. 遍历PDF中的对象,遇到是图像才进行下一步,不然就continue"""for index in range(1, xref_len):# 1.16.8版本用法 text = doc._getXrefString(index)# 最新版本text = pdf_info.xref_object(index)is_XObject = re.search(check_XObject, text)is_Image = re.search(check_Image, text)# 如果不是对象也不是图片,则不操作if is_XObject or is_Image:img_count += 1# 根据索引生成图像pix = fitz.Pixmap(pdf_info, index)pic_filepath = os.path.join(pic_dirpath, 'img_' + str(img_count) + '.png')"""pix.size 可以反映像素多少,简单的色素块该值较低,可以通过设置一个阈值过滤。以阈值 10000 为例过滤"""# if pix.size < 10000:#     continue"""三、 将图像存为png格式"""if pix.n >= 5:# 先转换CMYKpix = fitz.Pixmap(fitz.csRGB, pix)# 存为PNGpix.writePNG(pic_filepath)
import re
import fitzfilepath = 'D:\\组团学习\\task04_out1.pdf'
pic_dirpath = 'D:\\组团学习\\task04_out2'extract_picture_info(filepath,pic_dirpath)

转换为图片

def convert_to_picture(filepath, pic_dirpath):if not os.path.exists(pic_dirpath):os.makedirs(pic_dirpath)images = convert_from_bytes(open(filepath, 'rb').read())
#     images = convert_from_path(filepath, dpi=200)for image in images:# 保存图片pic_filepath = os.path.join(pic_dirpath, 'img_'+str(images.index(image))+'.png')image.save(pic_filepath, 'PNG')
from pdf2image import convert_from_bytesfilepath = 'D:\\组团学习\\task04_out1.pdf'
pic_dirpath = 'D:\\组团学习\\task04_out3'convert_to_picture(filepath, pic_dirpath)

Task04:Python操作PDF相关推荐

  1. task04 办公自动化之Python 操作 PDF

    # 基本库导入 import pandas as pd import numpy as np 1.相关库了解 利用python操作pdf会用到两个库,分别是:PyPDF2 和 pdfplumber 其 ...

  2. python怎么玩pdf_最全总结!聊聊 python 操作PDF的几种方法

    作者:陈熹 来源:早起Python 一.前言 大家好,有关Python操作PDF的案例之前已经写过一个PDF批量合并,这个案例初衷只是给大家提供一个便利的脚本,并没有太多讲解原理,其中涉及的就是PDF ...

  3. Python 操作 PDF 的几种方法

    作者 | 陈熹 来源 | 早起Python(ID:zaoqi-python) 头图 |  CSDN 下载自视觉中国 前言 大家好,有关 Python 操作 PDF 的案例之前已经写过一个????PDF ...

  4. python操作pdf做文档的分割、合并,内容提取

    Python 操作 PDF 会用的库:PyPDF2 和 pdfplumber PyPDF2 可以更好的读取.写入.分割.合并PDF文件: pdfplumber 可以更好的读取 PDF 文件中内容和提取 ...

  5. python 操作PDF文件 之 A3页面转A4

    python 操作PDF文件 A3页面转A4页面 文章目录 1. 需求概述 2. 代码实现 1. 需求概述 最近接到一份PDF资料需要打印,奈何页面是如图所示的A3格式的,奈何目前条件只支持打印A4. ...

  6. python批量上传pdf,Python 操作 PDF 的几种方法

    以下文章来源于早起 Python ,作者陈熹 作者 | 陈熹 来源 | 早起 Python(ID:zaoqi-python) 头图 | CSDN 下载自视觉中国 前言 大家好,有关 Python 操作 ...

  7. Python自动化办公系列之Python操作PDF

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 输 作者介绍: 大家可以叫我黄同学(博客名:Huang Supre ...

  8. 干货!Python操作PDF的神器——PyMuPDF

    点击上方"菜鸟学Python",选择"星标"公众号 超级无敌干货,第一时间送达!!! 来源:网络 01 PyMuPDF简介 1. 介绍 大家好,我是菜鸟哥.长假 ...

  9. 【实用篇】Python操作PDF文件

    PDF是Portable Document Format的缩写,这类文件通常使用 .pdf 作为其扩展名.在日常开发工作中,最容易遇到的就是从PDF中读取文本内容以及用已有的内容生成PDF文档这两个任 ...

  10. nsga2代码解读python_python自动化办公系列 | python操作pdf—— PyPDF2 和 pdfplumber模块(1)...

    看了好多代码,目前为止都是散乱的分享,接下来将整理作为专题,进行系统化的一个分享整理,也是我自己学习的过程.第一个的系统化的分享专题--python办公自动化.代码后面的#所表示的是注释,对本行代码进 ...

最新文章

  1. gitlab8.2-8.16-8.17-9.0升级
  2. 从技术平台到aPaaS平台
  3. 【转】单元测试基础知识
  4. python 中有x y y x吗_Python: x += y 与 x = x+y 的区别
  5. Python批量修改Word文档中特定关键字的颜色
  6. python语言开发平台_Go+Python双语言混合开发
  7. 【李宏毅2020 ML/DL】P86-87 More about Domain Adaptation
  8. 商城系统使用redis做什么_B2B2C商城系统与B2C商城系统有什么区别呢?企业该如何选择?...
  9. 【剑指offer】题目20 顺时针打印矩阵
  10. VIIRS SDR数据预处理(二)
  11. nacos启动报错 db.num is null【已解决】
  12. 什么是Base64 编码,Base64 编码有哪些优缺点?
  13. ​你不是真正的“匿名”:如何划定匿名数据和去识别化数据?
  14. struct所占的内存
  15. Echarts-实现3D柱状图显示,并单个柱子变色
  16. 阿狸表情图采集代码示例
  17. 解决JS中出现的兼容性问题
  18. QuickTime的桌面录制
  19. LED的高显指是什么意思?
  20. #4258. 铃铛计数问题

热门文章

  1. 百度富文本编辑jsp上传_百度富文本编辑器ueditor在jsp中的使用(ssm框架中的应用)...
  2. SEO 网站优化的步骤和技巧
  3. ad域下发策略,在 Azure AD 域服务中创建和管理组策略 | Microsoft Docs
  4. R语言使用epiDisplay包的clogistic.display函数获取条件logistic回归模型的汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)、保存csv
  5. 2021-2025年中国偏光镜支架行业市场供需与战略研究报告
  6. Zookeeper-实战
  7. Meta的画质让我震惊
  8. 从20年开源经历出发,70 后大龄程序员谈成长、困境与突围
  9. swf_upload_prepar 流程
  10. 常思过,负重远行,2017依然充满期待