iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0
Software Development

學 Python 到底可以幹麻勒?系列 第 30

( Day 30 ) PDF 拆分、合併、插入、刪除、反轉

  • 分享至 

  • xImage
  •  

這篇文章會介紹使用 Python 的 pikepdf 第三方函式庫,實作將拆分、合併、插入、刪除、取代和反轉 pdf 的功能,也會介紹如何將有密碼保護的 pdf 儲存為沒有密碼的 pdf,或將 pdf 儲存為有密碼保護的 pdf。

原文參考:PDF 拆分、合併、插入、刪除、反轉

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

PDF 拆分、合併、插入、刪除、反轉

安裝 pikepdf 函式庫

輸入下列指令安裝 pikepdf 函式庫,根據個人環境使用 pip 或 pip3。

!pip install pikepdf

開啟與儲存 pdf

載入 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

如果要取出 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')

合併 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 的指定頁數插入其他 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

如果要在刪除 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 裡的指定頁面替換成另外一頁,可以使用串列的操作,取代 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')

反轉 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')

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 29 ) 讀取 PDF 內容
下一篇
( Day 31 ) CSV 檔案操作
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言