這篇文章會介紹使用 Python 的 pikepdf 第三方函式庫,實作將拆分、合併、插入、刪除、取代和反轉 pdf 的功能,也會介紹如何將有密碼保護的 pdf 儲存為沒有密碼的 pdf,或將 pdf 儲存為有密碼保護的 pdf。
原文參考:PDF 拆分、合併、插入、刪除、反轉
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
輸入下列指令安裝 pikepdf 函式庫,根據個人環境使用 pip 或 pip3。
!pip install pikepdf
載入 pikepdf 後,使用 open 方法開啟 PDF 檔案,加入 password 參數也能開啟需要密碼的 pdf。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf = Pdf.open('oxxostudio.pdf', password='1234') # 開啟 pdf
pdf_pwd = Pdf.open('oxxostudio-pwd.pdf', password='1234') # 開啟需要密碼的 pdf
print(pdf)
print(pdf_pwd)
使用 save 方法可以儲存 pdf 檔案,搭配 pikepdf 裡 Permissions, Encryption 兩個模組,也能將 pdf 儲存為具有密碼保護的 pdf,下方程式碼會開啟一個密碼為 1234 的 pdf,並將其儲存為密碼是 qqqq 的 pdf。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf, Permissions, Encryption
pdf = Pdf.open('oxxostudio-pwd.pdf', password='1234') # 開啟密碼為 1234 的 pdf
no_extracting = Permissions(extract=False)
# 儲存為密碼是 qqqq 的 pdf
pdf.save('new.pdf', encryption = Encryption(user="qqqq", owner="qqqq", allow=no_extracting))
如果要取出 pdf 的「某一頁」,可以參考下方的程式碼,先使用 new() 的方法建立全新 pdf,接著使用串列的 append 方法將指定的頁面 ( 範例為 pages[0] ) 加入新的 pdf 中,存檔後就會變成一份單頁的 pdf。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf = Pdf.open('oxxostudio.pdf') # 開啟 pdf
pages = pdf.pages # 將每一頁的內容變成串列
output = Pdf.new() # 建立新的 pdf 物件
output.pages.append(pages[0]) # 添加頁面內容
output.save('new.pdf') # 儲存為新的 pdf
搭配 for 迴圈,就能將一份 pdf 的每一頁拆成各自獨立的 pdf。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf = Pdf.open('oxxostudio.pdf')
pages = pdf.pages
n = 1
for i in pages:
output = Pdf.new()
output.pages.append(i)
output.save(f'new_{n}.pdf') # 格式化檔案名稱
n = n + 1 # 編號加 1
如果要從 pdf 取出「特定範圍」的頁面,只要將串列的 append 方法改成 extend,就能加入特定串列範圍的頁面。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf = Pdf.open('test.pdf')
pages = pdf.pages
output = Pdf.new()
output.pages.extend(pages[1:3]) # 改用 extend,放入特定範圍的頁面
output.save('new.pdf')
如果要合併「單一頁面」,可以使用 new 建立一份全新的 pdf 物件後,使用串列的 append 方法將讀取的頁面加入,就能將多個頁面組合成一個新的 pdf。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf1 = Pdf.open('oxxo_1.pdf') # 讀取第一份 pdf
pdf2 = Pdf.open('oxxo_2.pdf') # 讀取第二份 pdf
pdf3 = Pdf.open('oxxo_3.pdf') # 讀取第三份 pdf
output = Pdf.new() # 建立新的 pdf 物件
output.pages.append(pdf1.pages[0]) # 添加第一頁到第一份
output.pages.append(pdf2.pages[0]) # 添加第一頁到第二份
output.pages.append(pdf3.pages[0]) # 添加第一頁到第三份
output.save('output.pdf')
如果要合併的 pdf 為「多頁面」,將串列的 append 方法換成 extend 就能將多頁面的 pdf 進行合併。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf1 = Pdf.open('oxxo_more_1.pdf') # 讀取第一份多頁面 pdf
pdf2 = Pdf.open('oxxo_more_2.pdf') # 讀取第一份多頁面 pdf
pdf3 = Pdf.open('oxxo_more_1.pdf') # 讀取第一份多頁面 pdf
output = Pdf.new()
output.pages.extend(pdf1.pages) # 添加所有頁面到第一份
output.pages.extend(pdf2.pages) # 添加所有頁面到第二份
output.pages.extend(pdf3.pages) # 添加所有頁面到第三份
output.save('output.pdf')
如果要在某一份 pdf 的指定頁數插入其他 pdf,可以使用串列的 insert 方法,在指定的頁數後方插入 pdf。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf1 = Pdf.open('oxxostudio.pdf') # 開啟第一份 pdf
pdf2 = Pdf.open('new.pdf') # 開啟第二份 pdf
pdf1.pages.insert(1, pdf2.pages[0]) # 在第一份的第一頁後方,插入第二份的第一頁
pdf1.save('output.pdf')
如果要在刪除 pdf 裡的指定頁面,可以使用串列的 del 方法,刪除 pdf 中的指定頁面。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf = Pdf.open('oxxosudio.pdf') # 開啟 pdf
del pdf.pages[1:2] # 刪除第二頁
pdf.save('output.pdf')
如果要在將 pdf 裡的指定頁面替換成另外一頁,可以使用串列的操作,取代 pdf 中的指定頁面。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf1 = Pdf.open('oxxosudio.pdf') # 開啟第一份 pdf
pdf2 = Pdf.open('new.pdf') # 開啟第二份 pdf
pdf1.pages[2] = pdf2.pages[0] # 將第一份的第三頁,換成第一份的第一頁
pdf1.save('output.pdf')
使用串列的 reverse 方法,就能反轉 pdf 中的所有頁面。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # Colab 換路徑使用
from pikepdf import Pdf
pdf = Pdf.open('output.pdf')
pdf.pages.reverse() # 反轉 pdf
pdf.save('output2.pdf')
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^