PDF操作
#encoding=utf-8
'''
Created on 2019年11⽉14⽇
@author: 瞌睡蟲⼦
'''
import fitz, os, re
import PyPDF2
def GetPagePic(pdfName,password=None,savePath=None, pageStart="begin", pageEnd="end"):
'''
`提取PDF
`⽂件名需要提取图像的PDF⽂件名
`⽂件密码    PDF⽂件密码,如果没有密码则为null
`保存⽂件名提取后的⽂件名
`页⾯范围数组形式,[开始页,结束页],其中"begin"代表第⼀页,"end"代表最后⼀页,可以有如下形式["begin",9] 或者 ["begine","end"]    '''
# 打开pdf
doc = fitz.open(pdfName);
if password is not None:
doc.authenticate(password);
# 图⽚数
pic_count=0;
# 默认存pdf⽬录
if not savePath:
savePath = os.path.dirname(pdfName);
# ⽂件名
filName = os.path.basename(pdfName);
filName = filName.split(".")[0];
pageSize = [pageStart,pageEnd];
pageSize=HandlePageSize(pageSize, doc.pageCount);
for pg in pageSize:
imglist = PageImageList(pg);
for i in imglist:
pic_count+=1;
pix = fitz.Pixmap(doc, i[0]);
fitz.Pixmap(fitz.csRGB, pix).writeImage("%s\%s_%d_%d.%s" % (savePath, filName,(pg+1), pic_count, "png"));
doc.close();
def GetAllPic(pdfName,password=None,savePath=None,picType="png"):
'''
`提取⽂件中的图像
`⽂件名需要提取图像的PDF⽂件名
`⽂件密码    PDF⽂件密码,如果没有密码则为null
`保存路径保存图⽚的路径,图⽚按照PDF⽂件名_序号的形式保存
`保存类型保存图⽚⽂件的类型,⽀持PNG、JPG、BMP
'''
# 打开pdf
doc = fitz.open(pdfName);
if password is not None:
doc.authenticate(password);
# 图⽚数
pic_count=0;
# 默认存pdf⽬录
if not savePath:
savePath = os.path.dirname(pdfName);
# ⽂件名
filName = os.path.basename(pdfName);
filName = filName.split(".")[0];
#    pageSize=HandlePageSize(pageSize, doc.pageCount);
for pg in range(doc.pageCount):
imglist = PageImageList(pg);
for i in imglist:
pic_count+=1;
pix = fitz.Pixmap(doc, i[0]);
fitz.Pixmap(fitz.csRGB, pix).writeImage("%s\%s_%d.%s" % (savePath, filName, pic_count, picType));
doc.close();
# 使⽤正则表达式来查图⽚
checkXO = r"/Type(?= */XObject)"
checkIM = r"/Subtype(?= */Image)"
# 打开pdf
doc = fitz.open(pdfName);
if password is not None:
doc.authenticate(password);
# 对象数
lenXREF = doc._getXrefLength();
# 图⽚数
pic_count=0;
# 默认存pdf⽬录
if not savePath:
savePath = os.path.dirname(pdfName);
# ⽂件名
filName = os.path.basename(pdfName);
filName = filName.split(".")[0];
# 遍历每⼀个对象
for i in range(1, lenXREF):
# 定义对象字符串
text = doc._getXrefString(i);
isXObject = re.search(checkXO, text);
# 使⽤正则表达式查看是否是图⽚
isImage = re.search(checkIM, text);
# 如果不是对象也不是图⽚,则continue
if not isXObject or not isImage:
continue;
pic_count += 1;
# 根据索引⽣成图像
pix = fitz.Pixmap(doc, i);
# 根据pdf的路径⽣成图⽚的名称
fitz.Pixmap(fitz.csRGB, pix).writeImage("%s\%s_%d.%s" % (savePath, filName, pic_count, picType));
pix = None;
doc.close();
def GetPageText(pdfName,password=None, pageStart="begin", pageEnd="end"):
'''
`读取⽂本
`输出到将提取的⽂本保存到变量(返回值)
`⽂件名需要读取⽂本的PDF⽂件名
`⽂件密码    PDF⽂件密码,如果没有密码则为null
`页⾯范围数组形式,[开始页,结束页],其中"begin"代表第⼀页,"end"代表最后⼀页,可以有如下形式["begin",9] 或者 ["begine","end"]    '''
# 打开⼀个PDF⽂件,doc为Document类型,是⼀个包含每⼀页PDF⽂件的列表
doc = fitz.open(pdfName);
if password is not None:
doc.authenticate(password);
pageSize = [pageStart,pageEnd];
pageSize=HandlePageSize(pageSize, doc.pageCount);
pageContent=[];
for pg in pageSize:
pageContent.append(PageText(doc, pg).strip());
return pageContent;
doc.close();
def PageSaveToPic(pdfName,password=None,savePath=None, pageStart="begin", pageEnd="end"):
'''
`导出页码为图⽚
`⽂件名需要导出成图像的PDF⽂件名
`⽂件密码    PDF⽂件密码,如果没有密码则为null
`保存⽂件名保存图⽚的路径
`导出页码需要导出成图像的页码
'''
# 打开⼀个PDF⽂件,doc为Document类型,是⼀个包含每⼀页PDF⽂件的列表
doc = fitz.open(pdfName);
if password is not None:
doc.authenticate(password);
# 设置图⽚的旋转⾓度
# 设置图⽚相对于PDF⽂件在X轴上的缩放⽐例
trans = fitz.Matrix(2.0, 2.0).preRotate(0);
trans = fitz.Matrix(2.0, 2.0).preRotate(0);
# 默认存pdf⽬录
if not savePath:
savePath = os.path.dirname(pdfName);
# ⽂件名
filName = os.path.basename(pdfName);
filName = filName.split(".")[0];
pageSize = [pageStart,pageEnd];
# 页码处理
pageSize=HandlePageSize(pageSize, doc.pageCount);
for pg in pageSize:
pm = PagePixmap(doc, pg, matrix=trans, alpha=False);
pm.writeImage("%s\%s_%d.%s" % (savePath, filName, (pg+1), "png"));
doc.close();
def PageCount(pdfName,password=None):
'''
`获取总页数
`输出到将总页数保存到变量(返回值)
`⽂件名    PDF⽂件名
`⽂件密码    PDF⽂件密码,如果没有密码则为null
'''
# 打开⼀个PDF⽂件,doc为Document类型,是⼀个包含每⼀页PDF⽂件的列表    doc = fitz.open(pdfName);
if password is not None:
doc.authenticate(password);
pageCount = doc.pageCount
doc.close();
return pageCount;
def PdfMerge(pdfPath,saveName):
'''
`合并PDF
`⽂件列表数组类型,需要合并的⽂件路径列表
`保存⽂件名合并后的⽂件名
'''
文件名提取
if type(pdfPath) == list and len(pdfPath)< 2:
raise Exception('⽆法合并单个PDF⽂件');
output = PyPDF2.PdfFileWriter()
outputPages = 0
for pdf_file in pdfPath:
f=open(pdf_file, "rb");
# 读取源PDF⽂件
inp = PyPDF2.PdfFileReader(f);
# 获得源PDF⽂件中页⾯总数
pageCount = NumPages();
outputPages += pageCount;
# 分别将page添加到输出output中
for iPage in range(pageCount):
output.Page(iPage));
# 写⼊到⽬标PDF⽂件
outputStream = open(saveName, "wb");
output.write(outputStream);
outputStream.close();
def HandlePageSize(pageSize, pageCount):
#    if type(pageSize) == int:
#        if pageSize < 1:
#            raise Exception('开始页码从1开始');
#        elif pageSize > pageCount:
#            raise Exception('开始页码必须⼩于结束页码');
#        return [pageSize-1];
if type(pageSize) == list and len(pageSize) == 2:
for i in range(len(pageSize)):
temp=pageSize[i];
if type(temp) == str:
temp = temp.lower();
if temp == "begin":
pageSize[i] = 1;
elif temp == "end":
pageSize[i] = pageCount;
else:
raise Exception('页码必须是数字');
elif type(temp) == int: