给pdf添加来自excel(xls)的分级书签

2018-02-03  本文已影响0人  汪浩瀚

很多参考用数据或者工具书要真的用起来,好的书签必不可少。但是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'))

上一篇下一篇

猜你喜欢

热点阅读