利用python給pdf新增目錄

2022-09-09 23:09:27 字數 4285 閱讀 7957

利用python讀取txt檔案時,使用的是python中的open方法,讀取檔案時最好加上檔案的編碼方式。不然有可能出現以下錯誤:

unicodedecodeerror: 'gbk' codec can't decode byte 0xa6 in position 14: illegal multibyte sequence
這是因為再windows系統中python讀取檔案時的預設編碼方式不是utf-8導致的。

實現**如下:

txtpath = "d:/目錄.txt"

with open(txtpath,'r',encoding='utf-8') as f:

list_data = f.read()

print(type(list_data)) # 列印檔案讀取得到變數的型別,輸出結果為「str」,即文字型別

print(list_data)

通過以上步驟已經可以讀取到txt檔案中的內容了,由於換行符、製表符在使用print輸出時會視覺化輸出,而不是輸出\t \n 這種轉移字元,而在進行文字內容解析時需要對這些轉義字元進行解析,所以現在需要將轉義字元原樣輸出,其方法是將字串放到陣列中,然後列印陣列。

實現**如下:

str='致謝\t5\n摘要\t6\nabstract\t8\n1 緒論\t16\n\t1.1 研究意義\t16\n\t'

print([str])

輸出結果:

['致謝\t5\n摘要\t6\nabstract\t8\n1 緒論\t16\n\t1.1 研究意義\t16\n\t']
而通過分析txt中的文字可以發現,txt檔案中的內容每行對應一條目錄,因此可以採用按行讀取的方式一行行的去對文字進行解析。

按行讀取的**如下:

with open(txtpath,'r',encoding='utf-8') as f:

for line in f:

print([line]) # 將行文字放在陣列中列印是為了檢視轉移字元

pass

觀察每行文字資訊可以發現,書籤的格式大致為

\t書籤文字\t頁碼\n
因此解析文字時,可以先找到倒數第乙個\t製表符,從而確定頁碼,然後就可以將頁碼以外的文字全部放到書籤文字中了,而書籤是幾級書籤,可以通過每行文字前面\t製表符的個數確定。

參考**:

for line in f:

line=line.replace('\n','') #去除\n

i0=line.rfind('\t') #在find前加r的效果是從後往前搜尋

page_num=int(line[i0+1:])

line=line[:i0]

i0=0

page_grade=0

while(line.find('\t',i0,-1)!=-1):

page_grade+=1

page_text=line.replace('\t','')

需要注意的是,在查詢倒數第乙個\t的時候,使用的事rfind函式,而不是find函式,這兩個函式的區別是,rfind函式從後往前找,find函式從前往後找。

這裡需要用到的是pypdf2庫,大概流程是用reader讀取pdf,將reader讀取到的pdf複製到writer中,然後給writer中的pdf新增標籤,最後儲存pdf即可。

實現的**如下:

from pypdf2 import pdffilereader as reader,pdffilewriter as writer

pdfpath = "d:/1.pdf"

pdf_in = reader(pdfpath)

pdf_out = writer()

# 將讀取的pdf放到writer中

pagecount = pdf_in.getnumpages()

for ipage in range(pagecount):

pdf_out.addpage(pdf_in.getpage(ipage))

parent0=pdf_out.addbookmark('父目錄',0,parent = none) # 新增父目錄

# 使用方法: addbookmark(書籤文字,書籤頁碼,書籤的父目錄),返回值是書籤(可以作為其他書籤的父目錄)

parent1=pdf_out.addbookmark('子目錄',0,parent = parent0) # 給父新增子目錄

# 儲存pdf

with open('d:/1-bookmark.pdf','wb') as fout:

pdf_out.write(fout)

在複製pdf時沒有使用clonedocumentfromreader()方法,因為實際使用時發現使用了這個方法會在新增書籤時報錯,所以使用了乙個折衷的方式,單頁pdf複製。

valueerror:  is not in list
為了讓書籤正確的新增到其父目錄底下,程式在設計時引用了乙個parent列表,實現方法如下:

parent=

curren_grade=0

with open(txtpath,'r',encoding='utf-8') as f:

for line in f:

line=line.replace('\n','') #去除\n

i0=line.rfind('\t') #在find前加r的效果是從後往前搜尋

page_num=int(line[i0+1:])

line=line[:i0]

i0=0

page_grade=0

while(line.find('\t',i0,-1)!=-1):

page_grade+=1

page_text=line.replace('\t','')

# 動態調整parent列表的長度

if curren_grade同時引用了乙個curren_grade變數,讓程式中的parent列表長度可以根據目錄總的等級數量動態的調整。

以下是程式的完整**,程式中txtpath為書籤檔案的輸入路徑,pdfpath為pdf路徑,新增書籤後的pdf輸出路徑為源目錄下pdf檔案檔名後新增_bm

比如輸入pdf路徑為d:/1.pdf時,輸出的路徑就是d:/1_bm.pdf

import numpy as np

from pypdf2 import pdffilereader as reader,pdffilewriter as writer

import os

def add_bookmarks(txtpath,pdfpath):

pdf_in = reader(pdfpath)

pdf_out = writer()

parent=

pagecount = pdf_in.getnumpages()

for ipage in range(pagecount):

pdf_out.addpage(pdf_in.getpage(ipage))

curren_grade=0

with open(txtpath,'r',encoding='utf-8') as f:

for line in f:

line=line.replace('\n','') #去除\n

i0=line.rfind('\t') #在find前加r的效果是從後往前搜尋

page_num=int(line[i0+1:])

line=line[:i0]

i0=0

page_grade=0

while(line.find('\t',i0,-1)!=-1):

page_grade+=1

if curren_grade接下來讓程式自動的讀取當前python指令碼檔案路徑下的pdf檔案和txt書籤,然後匹配書籤後再自動新增書籤,避免手動輸入路徑的繁瑣。

(未完待續)

用python合併pdf,並新增書籤_blowfishking的部落格-csdn部落格

python 反向查詢_weixin_30596735的部落格-csdn部落格

【python】讀取和輸出到txt_flora-csdn部落格

python遍歷目錄下所有檔案 - 努力奮鬥小青年 -

MacOS下給pdf新增書籤 目錄

每一次我看pdf檔案的時候都想要給它加書籤 preview下的書籤只是個標籤,叫目錄更合適 但每次都是以哭窮結尾,因為pdf編輯器實在是太貴了,太貴了,根本不是給普通人用的。今天看pdf檔案的時候突然想到,我可是乙個技術人啊,難道沒有什麼command line的解決辦法嗎?發現了coherent ...

PDF分析文字(1)利用python對PDF的讀取

1,安裝第三方庫檔案 pdfminer3k。安裝方式 pip install pdfminer3k 中文參考文件 3,資料獲取思路 1 通過pdf轉html,再利用爬蟲技術解決,目前來說這方面的技術比較成熟,而且參考很多。2 通過pdf轉為txt格式,再通過字元提取的方式處理。這樣的方式容易理解。3...

如何給PDF新增不能被刪除的水印

我們通常會使用給文件新增水印的方式達到保護版權或者宣傳的作用,但一般新增的水印都是可以直接刪除,那就失去了新增的意義,pdf檔案是否可以新增不能被其他人刪除的水印呢?首先我們需要先給pdf檔案新增水印,然後再將其設定成不被修改模式。在水印設定窗中點選瀏覽新增製作好的水印,可新增或pdf格式的水印檔案...