- 调用
combine_pdf()
可以将桌面下所有的PDF合并为output.pdf
。
- 调用
cut_pdf()
, 输入一个桌面下面的pdf文件,可以拆分PDF
"""
Created on Thu Aug 2 16:02:10 2018
PyPDF2的一些应用:
拆分PDF文件(书签信息不丢失)
合并PDF文件(书签信息不丢失,并且以原文件名字生成新的书签)
@author: Chen
"""
import winreg
import os
import PyPDF2 as pdf
import time
def GetDesktop():
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,\
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',)
return str(winreg.QueryValueEx(key, "Desktop")[0])
# get real index
def get_real_page(reader):
pageLabels = {}
for i in range(reader.numPages):
page = reader.getPage(i)
# 用一个字典把idnum与页码对应起来。
pageLabels[page.indirectRef.idnum]=i
return pageLabels
# get bookmark
def get_bookmark(reader):
real_page = get_real_page(reader)
outline = reader.outlines
bookmark = {}
for i in range(len(outline)):
bookmark[outline[i].title]=real_page[outline[i].page.idnum]
return bookmark
# cut out the object page and add its origin bookmark
def cut_pdf():
obj = str(input('输入文件名,包含".pdf":'))
if os.path.exists(obj):
f = open(obj,'rb')
# 创建一个reader对象来读取pdf文件的信息
reader = pdf.PdfFileReader(f)
bookmark = get_bookmark(reader)
# 创建一个pdfwriter对象用于生成新的pdf
writer = pdf.PdfFileWriter()
start = eval(input('输入开始页面:'))-1
end = eval(input('输入结束页面:'))-1
if end<=reader.numPages and start>=0:
for i in range(start,end+1):
page = reader.getPage(i)
writer.addPage(page)
#把原书签copy过去
for k,v in bookmark.items():
if v > start and v<end:
writer.addBookmark(k,v-start) #要减去起始界面,否则越界。
#创建一个pdf文件,命名为当前的时间戳
output = open(str(round(time.time()))+'.pdf','wb')
#向pdfwriter传入一个File对象,写入一个新的pdf文档
writer.write(output)
output.close()
f.close()
print('截取成功!')
else:
print('请输入正确的页码')
else:
print('请输入正确名称')
def combine_pdf():
pdf_list = []
if os.path.exists('combine'):
os.chdir('combine')
for i in os.listdir():
if '.pdf' in i:
pdf_list.append(i)
print('当前文件:',pdf_list)
if len(pdf_list)>1:
writer = pdf.PdfFileWriter()
num = 0
if not os.path.exists('output.pdf'):
for i in range(len(pdf_list)):
f=open(pdf_list[i],'rb')
reader = pdf.PdfFileReader(f)
bookmark = get_bookmark(reader)
for j in range(reader.numPages):
writer.addPage(reader.getPage(j))
writer.addBookmark(pdf_list[i][:-4],num)
for k,v in bookmark.items():
writer.addBookmark(k,v+num)
num = num+reader.numPages
output = open('output.pdf','ab')
writer.write(output)
output.close()
f.close()
else:
print('文件目录下不能有output.pdf')
os.chdir(GetDesktop())
if __name__ == '__main__':
#跳转到桌面
os.chdir(GetDesktop())
#合并pdf
combine_pdf()
#拆分pdf
cut_pdf()