因為pdf是掃瞄的格式,所以加書籤會很麻煩
可以先使用ocr軟體將目錄中的文字識別
這裡我將目錄處理成兩個檔案
bookmark.txt存放分級書籤資訊
page.txt存放對應的頁數
注意:頁數和實際書籍頁數可能會不一致(例如pdf頁碼是從封面開始算的,而書籍的第一頁並不算封面和內容)
我們可以編寫如下**:
# 按行讀取兩個檔案
fbookmark = open('bookmark',encoding='utf8').readlines()
page = open('page').readlines()
# 建立(幾級書籤,標題,頁碼)元組
bookmark = [(content.rfind('|') + 1,
content.strip()[content.rfind('|') + 1:],
int(p.strip())
) for content,p in zip(fbookmark,page)]
from pypdf2 import pdffilereader, pdffilewriter
# 開啟檔案
input = pdffilereader(open('input.pdf', 'rb'))
# 複製檔案
output = pdffilewriter()
pages = [input.getpage(i) for i in range(input.getnumpages())]
for page in pages:
output.addpage(page)
parent_set = {}
delta = 12 # 偏移量
# 建立分級書籤(注1)
for bm in bookmark:
# 將字典中小乙個等級的書籤當做父節點
parent = output.addbookmark(bm[1],
bm[2] + delta,
parent=parent_set.get(bm[0]-1))
# 向自己作為字典中該等級的節點
parent_set[bm[0]] = parent
with open('result.pdf','wb+') as f:
output.write(f)
注1:這裡建立分級書籤的方式嘗試了有一會兒,嘗試了棧結構,後來發現字典結構合適、方便。
效果如下:
(用於解析目錄,自動新增|分隔符)
with open('bookmark','r',encoding='utf8') as f:
c = f.readlines()
with open('bookmark2','w+',encoding='utf8') as output:
for line in c:
if line[0].isnumeric():
if line[1] == '.' and line[2].isnumeric():
output.write('|')
if line[3] == '.' and line[4].isnumeric():
output.write('|')
output.write(line)
Python利用PyPDF2庫獲取PDF檔案總頁碼
python中可以利用pypdf2庫來獲取該pdf檔案的總頁碼,可以根據下面的方法一步步進行下去 1 首先,要安裝pypdf2庫,利用以下命令即可 pip install pypdf22 接著,就是直接編寫 了,其中我新建了乙個py檔案,名為file utils.py,如下 from pypdf2 ...
pyPdf和pyPdf2在合併pdf時的那個異常
當乙個pdf檔案有多page的時候,它將出來見你!方法是取直接修改那個檔案generic.py 1 pypdf 路徑大約在這裡 usr lib python2.7 site packages pypdf generic.py if data.has key key multiple definiti...
Python中用PyPDF2拆分pdf提取頁面
有時候我們只需要pdf中的幾頁,或許還想把這幾頁內容整合成新的pdf,那該怎麼做呢?準備工作 安裝擴充套件庫pypdf2,參考命令 pip install pypdf2 如下 from pypdf2 import pdffilereader,pdffilewriter defsplit pdf fi...