# 基本库导入
import pandas as pd
import numpy as np

1、相关库了解

利用python操作pdf会用到两个库,分别是:PyPDF2 和 pdfplumber

其中PyPDF2可以读取,写入,分割,合并PDF文件,而pdfplumber可以更好地读取PDF文件中的内容以及提取PDF中的表格

由于这两个库都不是 Python 的标准库,所以在使用之前都需要单独安装

2、批量拆分

将一个完成的PPDF拆分成几个小PDF。因为涉及到PDF的拆分,所以需要用到PyPDF2这个库。

拆分思路:

  • 读取PDF的整体信息,总页数等
  • 遍历每一页内容,以每个step为间隔将PDF拆分成每一个小的文件快
  • 将小的文件重新保存为新的PDF文件

!!注意:拆分过程中,可以手动设置间隔,例如:每5页保存成一个小的PDF文件

以03.原料药行业.pdf为例,展示拆分过程

# 导库
import os
from PyPDF2 import PdfFileReader,PdfFileWriter
# 读取待拆分pdf文件
pdf_reader = PdfFileReader("D:\\study\\datawhale\\task04\\Python基础课件.pdf")
# 获取pdf的总页数
pages = pdf_reader.getNumPages()
pages
53
# 假设以5页为间隔
step=5
save_dirpath = "D:/study/datawhale/task04"
for page in range(0,pages,step): # 从0开始每隔一个step读取一次pagepdf_writer = PdfFileWriter() # 拆分pdf,每step页拆分为一个文件for index in range(page,page+step):   # 每个间隔中,读取其中的5页 #print(index)if index < pages:  # 如果页数小于pdf的总页数pdf_writer.addPage(pdf_reader.getPage(index))#保存拆分后的小文件save_path = os.path.join(save_dirpath,"Python基础课件" + str(int(page))+".pdf")with open(save_path,'wb') as out:pdf_writer.write(out)

将上述过程写成一个函数,之后只需要调用函数即可

def split_pdf(filename,filepath,save_dirpath,step=5):'''拆分PDF为多个小的PDF文件,@param filename:文件名@param filepath:待拆分文件的文件路径@param save_path:拆分后的小的PDF保存路径@param step:每step间隔的页面生成一个文件,例如step=5,表示0-4页、5-9页....为一个文件'''if not os.path.exists(save_dirpath):os.mkdir(save_dirpath)pdf_reader = PdfFileReader(filepath)for page in range(0,pages,step):pdf_writer = PdfFileWriter()for index in range(page,page+step):if index < pages: # 如果原文件页数不是5的倍数,最终会出现page+step数大于原pdf的总页数,后续的getPage(index)会报错,所以需要加这一行代码判断pdf_writer.addPage(pdf_reader.getPage(index))save_path = os.path.join(save_dirpath,filename + str(int(page))+"-"+str(int(page+step)) + ".pdf") with open(save_path,'wb') as out:pdf_writer.write(out)
split_pdf("Python基础课件","D:\\study\\datawhale\\task04\\Python基础课件.pdf","D:/study/datawhale/task04/Python基础课件导出结果")

Python基础课件.pdf一共有53页,以5页为间隔,最终生成了11个小的pdf文件

3、批量合并

合并思路:

  • 确定要合并的文件的顺序
  • 循环追加到一个文件块中
  • 保存成一个新的文件
s = os.listdir("D:\\study\\datawhale\\task04\\Python基础课件导出结果")
s[0][:-4].replace("Python基础课件","").split("-")[0]
'0'
def concat_pdf(filename,read_dirpath,save_filepath):'''合并多个PDF文件@param filename: 文件名@param read_dirpath:要合并的多个pdf的目录@param save_filepath:合并后文件的保存路径'''pdf_writer = PdfFileWriter()# 对文件名进行排序list_filenames = os.listdir(read_dirpath)list_filenames.sort(key=lambda x: int(x[:-4].replace(filename,"").split("-")[0]))  # 取出文件名中可以排序的部分print(list_filenames)for filename in list_filenames:filepath = os.path.join(read_dirpath,filename)# 读取每个小pdf文件pdf_reader = PdfFileReader(filepath)# 获取每个小pdf文件的总页数pages = pdf_reader.getNumPages()# 逐页添加至pdf_writerfor index in range(0,pages):pdf_writer.addPage(pdf_reader.getPage(index))# 保存合并后的文件with open(save_filepath,'wb') as out:pdf_writer.write(out)print("文件已合并完成,保存路径为%s" %(save_filepath))   
concat_pdf("Python基础课件","D:/study/datawhale/task04/Python基础课件导出结果","D:\\study\\datawhale\\task04\\Python基础课件合并版本.pdf")
['Python基础课件0-5.pdf', 'Python基础课件5-10.pdf', 'Python基础课件10-15.pdf', 'Python基础课件15-20.pdf', 'Python基础课件20-25.pdf', 'Python基础课件25-30.pdf', 'Python基础课件30-35.pdf', 'Python基础课件35-40.pdf', 'Python基础课件40-45.pdf', 'Python基础课件45-50.pdf', 'Python基础课件50-55.pdf']
文件已合并完成,保存路径为D:\study\datawhale\task04\Python基础课件合并版本.pdf

4、提取文字内容

因为涉及到pdf内容的操作,所以需要用到pdfplumber这个库

在进行文字提取的时候,主要用到 extract_text 这个函数

4.1 提取指定页面文字

import pdfplumber
def extract_text_info(filepath):'''提取pdf中的文字@param filepath:文件路径@return:'''with pdfplumber.open(filepath) as pdf:#获取第2页数据page = pdf.pages[1]print(page.extract_text())
# 原文件中没有表格
extract_text_info("易方达中小盘混合型证券投资基金2020年中期报告.pdf")
易方达中小盘混合型证券投资基金2020年中期报告
1重要提示及目录
1.1  重要提示
基金管理人的董事会、董事保证本报告所载资料不存在虚假记载、误导性陈述或重大遗漏,并
对其内容的真实性、准确性和完整性承担个别及连带的法律责任。本中期报告已经三分之二以上独
立董事签字同意,并由董事长签发。
基金托管人中国银行股份有限公司根据本基金合同规定,于2020年8月26日复核了本报告中
的财务指标、净值表现、利润分配情况、财务会计报告、投资组合报告等内容,保证复核内容不存
在虚假记载、误导性陈述或者重大遗漏。
基金管理人承诺以诚实信用、勤勉尽责的原则管理和运用基金资产,但不保证基金一定盈利。
基金的过往业绩并不代表其未来表现。投资有风险,投资者在作出投资决策前应仔细阅读本基
金的招募说明书及其更新。
本报告中财务资料未经审计。
本报告期自2020年1月1日起至6月30日止。
第2页共46页

结果提取处该页面所有的文字,包括页眉页脚的文字

# 提取第5页的文字,有表格
import pdfplumber
def extract_text_info(filepath):'''提取pdf中的文字@param filepath:文件路径@return:'''with pdfplumber.open(filepath) as pdf:#获取第2页数据page = pdf.pages[4]print(page.extract_text())
extract_text_info("易方达中小盘混合型证券投资基金2020年中期报告.pdf")
易方达中小盘混合型证券投资基金2020年中期报告
2基金简介
2.1  基金基本情况
基金名称  易方达中小盘混合型证券投资基金
基金简称  易方达中小盘混合
基金主代码  110011
交易代码  110011
基金运作方式  契约型开放式
基金合同生效日  2008年6月19日
基金管理人  易方达基金管理有限公司
基金托管人  中国银行股份有限公司
报告期末基金份额总额  3,160,109,122.14份
基金合同存续期  不定期
2.2  基金产品说明
通过投资具有竞争优势和较高成长性的中小盘股票,力求在有效控制风
投资目标
险的前提下,谋求基金资产的长期增值。
本基金基于定量与定性相结合的宏观及市场分析,进行战术性资产配置,
确定组合中股票、债券、货币市场工具及其他金融工具的比例,追求更
投资策略  高收益,回避市场风险。在股票资产方面,本基金采取“自下而上”的策
略,投资具有良好治理结构、在细分行业具有竞争优势以及有较高成长
性的中小盘股票。
45%×天相中盘指数收益率+35%×天相小盘指数收益率+20%×中债总指
业绩比较基准
数收益率
本基金是混合基金,理论上其风险收益水平高于债券基金和货币市场基
风险收益特征
金,低于股票基金。
2.3  基金管理人和基金托管人
项目  基金管理人  基金托管人
名称  易方达基金管理有限公司  中国银行股份有限公司
姓名  张南  许俊
信 息 披 露
联系电话  020-85102688  010-66594319
负责人
电子邮箱  service@efunds.com.cn  fcid@bankofchina.com
客户服务电话  400 881 8088  95566
传真  020-85104666  010-66594942
第5页共46页

表格中的文字也被提取出来了

4.2 提取所有页面文字

# 提取所有也内容
def extract_text_info(filepath):'''提取pdf中的文字@param filepath:文件路径@return:'''with pdfplumber.open(filepath) as pdf:for page in pdf.pages:print(page.extract_text())
Python基础课件0-5.pdf
extract_text_info("Python基础课件导出结果/Python基础课件0-5.pdf")
Python基础知识
1.认识Python
1.1 Python概述
1.1.1 基本概念  1.1.2 语言优势  2020年2月的TIOBE的编程语言排行榜: Python也存在缺点:1.1.3 典型应用  2020-02-25_20-19-1421.2 安装Python环境  1.2.1 下载Python  https://www.python.org/downloads/目前最新版是3.8.21.2.2 安装Python  1.2.3 配置环境变量

文字部分全部提取出来了,但是内容并未提取出来

4.3 结合前面学习的python-word内容,将提取出来的文字内容写入word内

# 导入word相关的库
from docx import Documentdef extract_text_to_word(filename,file_dirpath,save_dirpath):'''从pdf中提取文字,并保存到word中@param filename:pdf文件名称@file_dirpath:pdf文件路径@save_path:word保存路径'''# 新建空白文档doc = Document()filepath = os.path.join(file_dirpath,filename)with pdfplumber.open(filepath) as pdf:for page in pdf.pages:text = page.extract_text() doc.add_section()  # 添加文档的节paragraph = doc.add_paragraph() #添加文档的段落paragraph.add_run(text)save_path =  os.path.join(save_dirpath,filename[:-4]+"_word版.docx")print(save_path)doc.save(save_path)
extract_text_to_word("易方达中小盘混合型证券投资基金2020年中期报告.pdf","D:\\study\\datawhale\\task04","D:\\study\\datawhale\\task04")
D:\study\datawhale\task04\易方达中小盘混合型证券投资基金2020年中期报告_word版.docx

5、提取表格内容

因为需要对pdf内容操作,所以需要用到pdfplumber这个库

5.1 一页仅有一张表格

def extract_table_info(filepath):'''提取pdf中的表格数据@param filepath: pdf文件路径@return:'''with pdfplumber.open(filepath) as pdf:# 获取第7页数据page = pdf.pages[6]# 如果一页只有一个表格,则设置表格的第一行为表头,剩下的为数据table_info = page.extract_table()print(table_info)df_table = pd.DataFrame(table_info[1:],columns=table_info[0])df_table.to_csv('demo.csv',index=False,encoding='gbk')
extract_table_info('易方达中小盘混合型证券投资基金2020年中期报告.pdf')
[['阶段', '份额净值增\n长率①', '份额净值增\n长率标准差\n②', '业绩比较基\n准收益率③', '业绩比较基\n准收益率标\n准差④', '①-③', '②-④'], ['过去一个月', '10.21%', '1.24%', '7.12%', '0.67%', '3.09%', '0.57%'], ['过去三个月', '28.19%', '1.21%', '11.55%', '0.82%', '16.64%', '0.39%'], ['过去六个月', '22.17%', '1.67%', '7.15%', '1.33%', '15.02%', '0.34%'], ['过去一年', '34.15%', '1.40%', '13.29%', '1.08%', '20.86%', '0.32%'], ['过去三年', '99.78%', '1.50%', '-0.02%', '1.08%', '99.80%', '0.42%'], ['自基金合同生\n效起至今', '661.08%', '1.44%', '57.23%', '1.37%', '603.85%', '0.07%']]

5.2 一页有多张表格

因为读取的表格会被存成二维数组,而多个二维数组就组成一个三维数组

遍历这个三位数组,就可以得到该页的每一个表格数据,对应的将 extract_table 函数 改成 extract_tables 即可

from openpyxl import load_workbook,Workbook
def extract_table_info(filepath):'''提取pdf中的表格数据@param filepath: pdf文件路径@return:'''# 新建一个excel用于后续多个表格的数据导出workbook = Workbook()sheet = workbook.activeworkbook.save("demo.xlsx")with pdfplumber.open(filepath) as pdf:# 获取第6页数据page = pdf.pages[5]# 多个表格的数据将以列表的形式存放在一个大的list中table_info = page.extract_tables()# print(table_info)for table in table_info:df_table = pd.DataFrame(table[1:],columns=table[0])  # 需要写入的数据# 读取待写入文件的数据,并转换为df表df = pd.DataFrame(pd.read_excel("demo.xlsx",sheet_name="Sheet"))# 获取原文件中的数据行数df_rows = df.shape[0]writer = pd.ExcelWriter("demo.xlsx",engine='openpyxl')book = load_workbook("demo.xlsx")writer.book = bookwriter.sheets = dict((ws.title,ws) for ws in book.worksheets)# 导出数据if df_rows==0:df_table.to_excel(writer,sheet_name="Sheet",startrow=df_rows,index=False) writer.save()#保存else:df_table.to_excel(writer,sheet_name="Sheet",startrow=df_rows+2,index=False) writer.save()#保存
extract_table_info('易方达中小盘混合型证券投资基金2020年中期报告.pdf')

6、提取图片内容

注意:提取图片和将pdf转为图片是不同的涵义

  • 提取图片:pdf中有的是文字,有的是表格,还有的部分是图片,提取图片就是将pdf中的图片提取出来;

  • 转为图片:将每一页pdf转为一张张的图片

提取图片需要用到PyMuPDF 模块中的fitz模块

6.1 安装库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyMuPDF

使用清华镜像安装更快

6.2 提取图片逻辑

  • 使用 fitz 打开文档,获取文档详细数据
  • 遍历每一个元素,通过正则找到图片的索引位置
  • 使用 Pixmap 将索引对应的元素生成图片
  • 通过 size 函数过滤较小的图片
参考:
https://blog.csdn.net/qq_15969343/article/details/81673970https://blog.csdn.net/qq_15969343/article/details/81673302
# 导入相关库
import fitz
import time
import re
import os
def pdf2pic(pdf_path,pic_path):'''从pdf中提取图片@param pdf_path:pdf路径@param pic_path:图片保存的路径@return:''' # 判断pic_path是否存在t0 = time.time()if not os.path.exists(pic_path):os.mkdir(pic_path)#  使用正则表达式查找pdf中的图片位置checkXO = r"/Type(?= */XObject)"checkIM = r"/Subtype(?= */Image)"# 图片计数imgcount=0# 打开pdfpdf = fitz.open(pdf_path)len_xref = pdf.xref_length()# 打印pdf的信息print("文件名:{},页数:{},对象:{}".format(pdf_path,len(pdf),len_xref-1))# 遍历pdf中的对象,遇到是图片才进行下一步,不然就continue# 遍历每个对象for i in range(1,len_xref):# 定义对象字符串text = pdf.xref_object(i)isXObject = re.search(checkXO,text)# 使用正则表达式查看是否是图片isImage = re.search(checkIM,text)# 入宫不是对象,也不是图片,则continueif not isXObject or not isImage:continueimgcount += 1# 根据索引生成图像pix = fitz.Pixmap(pdf,i)# 根据pdf的路径生成图片的名称new_name = pdf_path.replace("\\","_") + "_img{}.png".format(imgcount)new_name = new_name.replace(":","")# 将图像存储为png格式# 如果pix.n<5,k可以直接存储为jpng格式# 如果pix.n>5,先转换为CMYKif pix.n >= 5:# 转为CMYKpix = fitz.Pixmap(fitz.csRGB,pix)pix.writePNG(os.path.join(pic_path,new_name))# 释放资源pix=Nonet1 = time.time()print("运行时间:{}".format(t1-t0))print("提取了{}张图片".format(imgcount))
pdf2pic("易方达中小盘混合型证券投资基金2020年中期报告.pdf","导出的图片")
文件名:易方达中小盘混合型证券投资基金2020年中期报告.pdf,页数:46,对象:15284
运行时间:0.02592945098876953
提取了1张图片

7、转为图片

7.1 安装pdf2image库

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pdf2image

7.2 安装组件

对于 windows 用户需要安装 poppler for Windows,安装链接是:http://blog.alivate.com.au/poppler-windows/

另外,还需要添加环境变量, 将 bin 文件夹的路径添加到环境变量 PATH 中,安装好后需要重启电脑生效

7.3 代码流程

import os
from pdf2image import convert_from_bytes
def pdf2img(filepath,pic_dirpath):if not os.path.exists(pic_dirpath):os.mkdir(pic_dirpath)images = convert_from_bytes(open(filepath,'rb').read())for image in images:# 保存图片pic_filepath = os.path.join(pic_dirpath,"img_"+ str(images.index(image)) + ".png")image.save(pic_filepath,'PNG')
pdf2img("Python基础课件合并版本.pdf",'导出的图片')

8、添加水印

PDF 中添加水印,首先需要一个水印PDF文件,然后依次通过 mergePage 操作将每一页的 PDF 文件合并到水印文件上,据此,每一页的 PDF 文件将是一个带有水印的 PDF 文件

最后,将每一页的水印 PDF 合并成一个 PDF 文件即可

8.1生成水印

生成水印的方式比较多,例如在图片添加水印,然后将图片插入到 word 中,最后将 word 保存成 PDF 文件即可

用 Python 进行水印的添加总共需要三步

  • 生成一张透明的水印
  • 将水印添加到一张空白图片上生成水印背景
  • 将水印背景粘贴到原图对应的位置上去

一般我们生成水印可以选择两种方式:固定位置的水印和全屏水印,比如微博照片那种是固定位置(右下角),付费文档那种就是全屏水印

8.1.1 给pdf添加水印

(1)前期准备

新建 watermark.pdf 文件
实际的水印,可以在此文件里修改水印文字的字体和位置。
实现步骤:

  • 新建 watermark.word ,【设计】 → \to→ 【水印】
  • 【自定义水印】 → 【文字水印】
  • 输入【文字】,修改【字体】、【自号】、【颜色】和【板式】
  • 另存为 watermark.pdf
# 读取待加水印的pdf
pdf_reader = PdfFileReader("易方达中小盘混合型证券投资基金2020年中期报告.pdf")
# 获取pdf的页数
pdf_pages = pdf_reader.getNumPages()# 创建一个空白的pdf对象
pdf_writer = PdfFileWriter()t1 = time.time()
for page_index in range(pdf_pages):current_page = pdf_reader.getPage(page_index)# 封面页不添加水印if page_index == 0:new_page = current_pageelse:# 读取水印文件watermark = PdfFileReader("water_mark.pdf")watermark_page = watermark.getPage(0)new_page = watermark_pagenew_page.mergePage(current_page)pdf_writer.addPage(new_page)
# 保存水印后的文件
with open("加水印后.pdf", "wb") as out:pdf_writer.write(out)
t2 = time.time()
print("耗费时长:{}".format(t2-t1))
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
耗费时长:13.818940877914429

上述这个方法在循环体中每次都要调用读取水印文件,时间复杂度较高,修改部分代码

# 读取待加水印的pdf
pdf_reader = PdfFileReader("易方达中小盘混合型证券投资基金2020年中期报告.pdf")
# 获取pdf的页数
pdf_pages = pdf_reader.getNumPages()# 读取水印文件
watermark = PdfFileReader("water_mark.pdf")
watermark_page = watermark.getPage(0)# 创建一个空白的pdf对象
pdf_writer = PdfFileWriter()t1 = time.time()
for page_index in range(pdf_pages):current_page = pdf_reader.getPage(page_index)# 封面页不添加水印if page_index == 0:pdf_writer.addPage(current_page)else:# 当前pdf页面添加水印current_page.mergePage(watermark_page)pdf_writer.addPage(current_page)
# 保存水印后的文件
with open("加水印后2.pdf", "wb") as out:pdf_writer.write(out)
t2 = time.time()
print("耗费时长:{}".format(t2-t1))
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
耗费时长:13.389281511306763

9、文档加密与解密

9.1 简单加密解密

有时候打开一个pdf文件需要输入密码才能看到,这就是加密文档

本节所提到的也只是基于 PDF 文档的加密解密,而不是所谓的 PDF 密码破解。

在对 PDF 文件加密需要使用 encrypt 函数,对应的加密代码也比较简单:

pdf_reader = PdfFileReader("易方达中小盘混合型证券投资基金2020年中期报告.pdf")
pdf_writer = PdfFileWriter()for page_index in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page_index))# 添加密码
pdf_writer.encrypt("123456")
with open("加密文档.pdf", "wb") as out:pdf_writer.write(out)
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体

根据这个思路,破解 PDF 也可以通过暴力求解实现,例如:通过本地密码本一个个去尝试,或者根据数字+字母的密码形式循环尝试,最终成功打开的密码就是破解密码。但是这个方法比较耗时耗力,不建议

另外,针对已经加密的 PDF 文件,也可以使用 decrypt 函数进行解密操作

解密代码如下:

pdf_reader = PdfFileReader("加密文档.pdf")
# PDF文档解密
pdf_reader.decrypt('123456')pdf_writer = PdfFileWriter()
for page_index in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page_index))with open("解密后的文档.pdf", "wb") as out:pdf_writer.write(out)
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体

这个是针对已经知道密码的情况下的解密

9.2 知道密码位数及构成方式的暴力破解

pdf_reader = PdfFileReader("易方达中小盘混合型证券投资基金2020年中期报告.pdf")
pdf_writer = PdfFileWriter()for page_index in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page_index))# 添加密码
pdf_writer.encrypt("20zj")
with open("加密文档.pdf", "wb") as out:pdf_writer.write(out)
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体
/ABCDEE+宋体

9.2 完全不知道密码构成的穷举法

使用itertools,可以构建含需要组合的生成器供后续迭代

设知道密码位数——4位

import itertools
mylist = ("".join(x) for x in itertools.product("0123456789abcdefghijklmnopqrstuvwxyz", repeat=4))pdf_reader =PdfFileReader("加密文档.pdf")
t1 = time.time()
while True:i = next(mylist)if pdf_reader.decrypt(i):print(f"解密成功,密码是{i}")break
t2 = time.time()
print("消耗的时间为:{}".format(t2-t1))

task04 办公自动化之Python 操作 PDF相关推荐

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

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

  2. Python 操作 PDF 的几种方法

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

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

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

  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自动化办公系列之Python操作PDF

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

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

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

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

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

  9. 8、【办公自动化】Python实现PDF文件的批量操作

    说明 平时工作中,经常会和 PDF 文件打交道,比如,合并.拆分.加解密.添加和去除水印.提取指定内容.转换成其他文件格式等操作.如果只是处理单个 PDF 文件的话,有些操作是比较简单的,而如果需要批 ...

最新文章

  1. Class-dump
  2. java native code_原生代码(native code)
  3. [C/C++基础知识] 一篇就让你彻底搞懂qsort快速排序的文章
  4. LeetCode 695. 岛屿的最大面积(图的BFS/DFS)
  5. oracle基本的操作
  6. 支付宝信用卡还款也开始收费了!但还是比微信便宜2元...
  7. mongoose c++封装
  8. php 异步执行shell脚本
  9. oracle中每月调用一次,JOB——手工指定Oracle中job执行的时间间隔
  10. 关于new pad利用iPad12的资源缩放的问题 contentScaleFactor设置
  11. Ubuntu 16.04 一系列软件安装命令,包括QQ、搜狗、Chrome、vlc、网易云音乐安装方法
  12. web在线播放flv视频
  13. php css抽离,webpack4 单独抽离打包 css 的新实现
  14. lifecycle-aware components(生命周期感知组件用法和原理)
  15. css 多边形边框(八边形)
  16. [Canvas系列]Canvas简单线条绘制_02
  17. matplotlib之饼图
  18. Windows2000、XP、2003系统万能Ghost全攻略(转)
  19. 页面左侧二级菜单20种案例
  20. MATLAB 生成高清 矢量图+图局部放大

热门文章

  1. 阿里云部署公司网盘实例
  2. ISTQB- TTA大纲
  3. 戴尔服务器R200安装 centos7(U盘安装)
  4. 服务器硬件与 Linux 初体验
  5. buctoj周赛(5)逃离(三分+思维)
  6. 任意多边形的面积(C语言)
  7. 王者nba服务器维护,王者NBA新手常用问题FAQ大全
  8. 图解 SQL 基础知识
  9. 有些微信朋友,每天喜欢发早安、图片给别人,这些人是什么心理?
  10. 第二类换元法倒代换专项训练