Python使用PyPDF2庫(kù)實(shí)現(xiàn)向PDF文件中插入內(nèi)容
一、引言
PDF(Portable Document Format)文件因其跨平臺(tái)、不易被篡改的特性,廣泛應(yīng)用于日常辦公和文檔交流中。在實(shí)際應(yīng)用中,我們經(jīng)常需要將一個(gè)PDF文件的內(nèi)容插入到另一個(gè)PDF文件的指定位置。這通常需要使用專(zhuān)門(mén)的PDF處理工具或庫(kù)來(lái)完成。Python的PyPDF2庫(kù)就是這樣一個(gè)強(qiáng)大的工具,它允許我們方便地操作PDF文件,包括合并、拆分、旋轉(zhuǎn)頁(yè)面等操作。
二、PyPDF2庫(kù)的安裝
首先,我們需要安裝PyPDF2庫(kù)??梢允褂胮ip命令進(jìn)行安裝:
pip install PyPDF2
三、PyPDF2庫(kù)的基本使用
PyPDF2庫(kù)提供了多個(gè)類(lèi)和方法,用于處理PDF文件。其中,PdfFileReader類(lèi)用于讀取PDF文件的內(nèi)容,而PdfFileWriter類(lèi)則用于創(chuàng)建和寫(xiě)入PDF文件。
下面是一個(gè)簡(jiǎn)單的示例,演示如何使用PyPDF2庫(kù)合并兩個(gè)PDF文件:
from PyPDF2 import PdfFileReader, PdfFileWriter
# 創(chuàng)建PDF寫(xiě)入對(duì)象
output = PdfFileWriter()
# 讀取第一個(gè)PDF文件
input1 = PdfFileReader(open("file1.pdf", "rb"))
# 讀取第二個(gè)PDF文件
input2 = PdfFileReader(open("file2.pdf", "rb"))
# 將第一個(gè)PDF文件的所有頁(yè)面添加到輸出文件中
for i in range(input1.getNumPages()):
output.addPage(input1.getPage(i))
# 將第二個(gè)PDF文件的所有頁(yè)面添加到輸出文件中
for i in range(input2.getNumPages()):
output.addPage(input2.getPage(i))
# 將合并后的PDF文件寫(xiě)入到新的文件中
with open("output.pdf", "wb") as outputStream:
output.write(outputStream)四、在PDF文件中插入內(nèi)容
要在第一個(gè)PDF文件的中間插入第二個(gè)PDF文件的內(nèi)容,我們需要對(duì)上面的代碼進(jìn)行一些修改。具體步驟如下:
讀取第一個(gè)和第二個(gè)PDF文件。
將第一個(gè)PDF文件的部分頁(yè)面添加到輸出文件中。
將第二個(gè)PDF文件的所有頁(yè)面添加到輸出文件中。
將第一個(gè)PDF文件的剩余頁(yè)面添加到輸出文件中。
將合并后的PDF文件寫(xiě)入到新的文件中。
下面是一個(gè)完整的示例代碼:
from PyPDF2 import PdfFileReader, PdfFileWriter
# 定義要插入的起始頁(yè)碼
insert_start_page = 3 # 假設(shè)要在第一個(gè)PDF文件的第3頁(yè)后插入第二個(gè)PDF文件的內(nèi)容
# 創(chuàng)建PDF寫(xiě)入對(duì)象
output = PdfFileWriter()
# 讀取第一個(gè)PDF文件
input1 = PdfFileReader(open("file1.pdf", "rb"))
# 讀取第二個(gè)PDF文件
input2 = PdfFileReader(open("file2.pdf", "rb"))
# 將第一個(gè)PDF文件的前insert_start_page-1頁(yè)添加到輸出文件中
for i in range(insert_start_page - 1):
output.addPage(input1.getPage(i))
# 將第二個(gè)PDF文件的所有頁(yè)面添加到輸出文件中
for i in range(input2.getNumPages()):
output.addPage(input2.getPage(i))
# 將第一個(gè)PDF文件的剩余頁(yè)面添加到輸出文件中
for i in range(insert_start_page - 1, input1.getNumPages()):
output.addPage(input1.getPage(i))
# 將合并后的PDF文件寫(xiě)入到新的文件中
with open("output.pdf", "wb") as outputStream:
output.write(outputStream)在上面的代碼中,我們定義了一個(gè)變量insert_start_page,表示要在第一個(gè)PDF文件的哪一頁(yè)后插入第二個(gè)PDF文件的內(nèi)容。然后,我們通過(guò)循環(huán)將第一個(gè)PDF文件的前insert_start_page-1頁(yè)和剩余頁(yè)面分別添加到輸出文件中,并在中間插入了第二個(gè)PDF文件的所有頁(yè)面。
五、注意事項(xiàng)和擴(kuò)展
在處理大文件或需要高性能的場(chǎng)景時(shí),可以考慮使用其他更高效的PDF處理庫(kù),如PyMuPDF(fitz)或pdfplumber。
PyPDF2庫(kù)在處理復(fù)雜的PDF文件(如包含加密、數(shù)字簽名或特殊字體)時(shí)可能會(huì)遇到一些問(wèn)題。在實(shí)際應(yīng)用中,需要根據(jù)具體情況選擇合適的庫(kù)和工具。
如果需要更精細(xì)地控制PDF文件的布局和格式,可以考慮使用專(zhuān)業(yè)的PDF編輯軟件或庫(kù)進(jìn)行手動(dòng)編輯或編程處理。
六、知識(shí)補(bǔ)充
除了向PDF中插入內(nèi)容,小編還為大家整理了一些其他PyPDF2庫(kù)操作PDF的方法,感興趣的可以了解下
讀取PDF中的內(nèi)容
# author:mlnt
# createdate:2022/8/16
import PyPDF2 # 導(dǎo)入PyPDF2模塊
# 官方文檔:https://pypi.org/project/PyPDF2/
# 1.打開(kāi)PDF文件
pdf = open(file='test.pdf', mode='rb') # 以二進(jìn)制方式打開(kāi)
# 2.獲取PDF文件的頁(yè)數(shù)
# 打開(kāi)PDF文件成功后,可使用PdfFileReader()方法讀取PDF內(nèi)容
pdf_reader = PyPDF2.PdfFileReader(pdf) # 讀取PDF內(nèi)容
print(f'PDF頁(yè)數(shù)為:{pdf_reader.numPages}')
print(f'PDF頁(yè)數(shù)為:{len(pdf_reader.pages)}')
# 3.讀取PDF頁(yè)面內(nèi)容
"""
- 使用PdfFileReader()方法讀取PDF文件后,可使用getPage(n)(或pages[n])獲取第n頁(yè)的PDF內(nèi)容
- PDF頁(yè)面從第0頁(yè)開(kāi)始計(jì)算
- 頁(yè)面內(nèi)容被讀入后,可使用extractText()取得該頁(yè)的字符串內(nèi)容
"""
for i in range(pdf_reader.numPages):
pageObj = pdf_reader.getPage(i) # 讀取第i頁(yè)內(nèi)容
# pageObj = pdf_reader.pages[i] # 讀取第i頁(yè)內(nèi)容
page_content = pageObj.extractText() # 提取頁(yè)面內(nèi)容
print(page_content)
PDF簡(jiǎn)單加密與解密
# author:mlnt
# createdate:2022/8/16
import PyPDF2
from PyPDF2 import PdfReader, PdfWriter
def checkEncrypted(filename):
"""檢查文件是否加密"""
pdfObj = open(file=filename, mode='rb') # 以二進(jìn)制方式打開(kāi)
pdfRd = PyPDF2.PdfFileReader(pdfObj) # 讀取PDF內(nèi)容
# 判斷文件是否加密
if pdfRd.isEncrypted:
print(f'{filename}屬于加密文件')
else:
print(f'{filename}未加密')
def pdfEncrypt(filename):
"""pdf加密"""
reader = PdfReader(filename) # 創(chuàng)建RdfReader對(duì)象
writer = PdfWriter() # 創(chuàng)建PdfWriter對(duì)象
# 將所有頁(yè)面添加到writer
for page in reader.pages:
# PDF頁(yè)面旋轉(zhuǎn)
page.rotate_clockwise(90) # 旋轉(zhuǎn)90度
page.rotate_clockwise(-180) # 逆時(shí)針旋轉(zhuǎn)180度
writer.add_page(page)
# 添加密碼
writer.encrypt('123456')
new_name = filename[:filename.rfind('.pdf')] + '-encrypted.pdf'
# 保存pdf
with open(new_name, 'wb') as f:
writer.write(f)
def pdfDecrypt(filename):
"""pdf解密"""
reader = PdfReader(filename)
writer = PdfWriter()
# 判斷是否加密
if reader.isEncrypted:
reader.decrypt('123456')
for page in reader.pages:
writer.add_page(page)
new_name = filename[:filename.rfind('.pdf')] + '-decrypted.pdf'
# 保存pdf
with open(new_name, 'wb') as f:
writer.write(f)
checkEncrypted('test.pdf')
pdfEncrypt('test.pdf')
pdfDecrypt('test-encrypted.pdf')
合并PDF文件
# author:mlnt
# createdate:2022/8/16
from PyPDF2 import PdfMerger
merger = PdfMerger() # 創(chuàng)建PdfMerger對(duì)象
pdf1 = open('test.pdf', 'rb')
pdf2 = open('watermark.pdf', 'rb')
# 將整個(gè)文檔添加到merger
merger.append(fileobj=pdf1)
# 將pdf2插入到merger,從第0頁(yè)開(kāi)始
merger.merge(position=0, fileobj=pdf2)
with open('merger-test.pdf', 'wb') as f:
merger.write(f)
merger.close()
七、總結(jié)
通過(guò)本文的介紹,我們了解了如何使用Python的PyPDF2庫(kù)將一個(gè)PDF文件的內(nèi)容插入到另一個(gè)PDF文件的指定位置。通過(guò)合理的代碼組織和注釋?zhuān)率峙笥芽梢愿菀椎乩斫獠⒄莆者@一技術(shù)。當(dāng)然,PyPDF2庫(kù)只是眾多PDF處理工具之一,根據(jù)實(shí)際需求,我們還可以選擇其他更適合的庫(kù)或工具來(lái)完成PDF文件的處理工作。
到此這篇關(guān)于Python使用PyPDF2庫(kù)實(shí)現(xiàn)向PDF文件中插入內(nèi)容的文章就介紹到這了,更多相關(guān)Python PyPDF2向PDF插入內(nèi)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python利用PyPDF2庫(kù)實(shí)現(xiàn)輕松提取PDF文本
- Python使用PyPDF2?Pillow庫(kù)來(lái)將PDF文件轉(zhuǎn)圖片
- PyPDF2讀取PDF文件內(nèi)容保存到本地TXT實(shí)例
- 解決pyPdf和pyPdf2在合并pdf時(shí)出現(xiàn)異常的問(wèn)題
- Python實(shí)現(xiàn)PyPDF2處理PDF文件的方法示例
- Python中使用pypdf2合并、分割、加密pdf文件的代碼詳解
- Python使用pdfplumber庫(kù)高效解析PDF文件
- Python利用pdfplumber庫(kù)提取pdf中表格數(shù)據(jù)
- python用pdfplumber提取pdf表格數(shù)據(jù)并保存到excel文件中
- Python利用pdfplumber實(shí)現(xiàn)讀取PDF寫(xiě)入Excel
- python使用PyPDF2 和 pdfplumber操作PDF文件
相關(guān)文章
python自動(dòng)化測(cè)試之從命令行運(yùn)行測(cè)試用例with verbosity
這篇文章主要介紹了python自動(dòng)化測(cè)試之從命令行運(yùn)行測(cè)試用例with verbosity,是一個(gè)較為經(jīng)典的自動(dòng)化測(cè)試實(shí)例,需要的朋友可以參考下2014-09-09
Python二叉樹(shù)定義與遍歷方法實(shí)例分析
這篇文章主要介紹了Python二叉樹(shù)定義與遍歷方法,結(jié)合實(shí)例形式分析了二叉樹(shù)的概念、原理及Python定義、遍歷二叉樹(shù)相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
讀寫(xiě)json中文ASCII亂碼問(wèn)題的解決方法
下面小編就為大家?guī)?lái)一篇讀寫(xiě)json中文ASCII亂碼問(wèn)題的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
Python利用標(biāo)簽實(shí)現(xiàn)清理微信好友的自動(dòng)化腳本
微信已經(jīng)成為我們?nèi)粘I钪胁豢苫蛉钡纳缃还ぞ?隨著使用時(shí)間的增長(zhǎng),我們的微信好友列表可能會(huì)變得越來(lái)越臃腫,所以本文為大家準(zhǔn)備了通過(guò)標(biāo)簽清理微信好友的Python自動(dòng)化腳本,希望對(duì)大家有所幫助2024-12-12
pytorch中的numel函數(shù)用法說(shuō)明
這篇文章主要介紹了pytorch中的numel函數(shù)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
python matplotlib 注釋文本箭頭簡(jiǎn)單代碼示例
這篇文章主要介紹了python matplotlib 注釋文本箭頭簡(jiǎn)單代碼示例,具有一定借鑒價(jià)值。2018-01-01

