很多参考用数据或者工具书要真的用起来,好的书签必不可少。但是pdf中添加书签比较慢,于是做一个python的小程序,用excel(仅支持xls格式)中的数据为pdf添加书签。
excel中的数据格式要满足图片中的格式。由于要做分级书签,因此excel中用“:”(英文输入法的冒号)作为书签名和书签对应页码的符号。
excel数据和pdf书签的对应关系看图。
要注意的是:excel中页码不能超过pdf总页数。
python版本3.6.2
from PyPDF2 import PdfFileWriter, PdfFileReader
import xlrd
用的时候直接改代码中的路径
input_pdf_name= 'GBT 26119-2010 绿色制造 机械产品生命周期评价 总则.pdf'
output_pdf_name= '带标签.pdf'
xls_name= '111.xls'
所有代码:
'''
pdf添加标签代码,需要复制出一个新的pdf,原有pdf不变,原标签不会影响结果也不受影响
created 20180203
by wanghaohan
'''
from PyPDF2import PdfFileWriter, PdfFileReader
import xlrd
# 输入相关文件路径
input_pdf_name= 'GBT 26119-2010 绿色制造 机械产品生命周期评价 总则.pdf'
output_pdf_name= '带标签.pdf'
xls_name= '111.xls'
# 创建新的pdf类,并把原有pdf复制进去
output_pdf= PdfFileWriter()
input_pdf= PdfFileReader(open(input_pdf_name, 'rb'))
for pdf_pagein input_pdf.pages:
output_pdf.addPage(pdf_page)
xls_data= xlrd.open_workbook(xls_name)
sheet= xls_data.sheet_by_index(0)
first_col= sheet.col_values(0)
parents= [None]* sheet.ncols# 一开始时,None表示为一级书签
for item_row_numin range(sheet.nrows): # 遍历每列的每一个值,相当于所有一级书签
item_row= sheet.row_values(item_row_num)
parents[-1]= None # 每一行的第一个单元都是一级标签,他的父标签是None
for item_cellin item_row: # 遍历当前行的每一个单元,相当于一级书签的所有子书签(也可能为空)
if item_cell!= '':
mark_name, mark_page= item_cell.split(':')
cell_num= item_row.index(item_cell)
parents[cell_num]= output_pdf.addBookmark(mark_name, int(mark_page)-1, parents[cell_num-1] )# add parent bookmark
output_pdf.write(open(output_pdf_name, 'wb'))
网友评论