楊育晟(Peter Yang)

嗨, 我叫育晟, 部落格文章主題包含了程式設計、財務金融及投資...等等,內容多是記錄一些學習的過程和心得,任何想法都歡迎留言一起討論。



Email: ycy.tai@gmail.com
LinkedIn: Peter Yang
Github: ycytai

Python和PDF相關套件的使用(reportlab/PyPDF2)

Python對於PDF檔的操作範例

當有自動化產文件的需求,此時程式就可以派上用場,Python同樣有支援生成和打印文字於pdf上的功能。

reportlab

首先安裝套件-reportlab

pip install reportlab

生成新PDF檔案

引入所需要用到的函式

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
import io

生成名為 demo.pdf 的檔案

page = canvas.Canvas('demo.pdf', pagesize=A4)
page.drawString(100, 500, 'Hello World!.')
page.save()

此時點開路徑內的檔案,就可以看到剛印出的文字了

PyPDF2

在既有檔案中打印文字

如果不是要生成新檔案,而是要讀寫的話,則使用另一個套件 PyPDF2

pip install PyPDF2

打印文字需分為四個步驟

  1. 讀取原有檔案
  2. 生成打印文字
  3. 將打印文字加入原有檔案
  4. 生成新檔案

讀取原有檔案

先以python內建的file system以read byte的方式讀取檔案,再轉換為 PdfReader

from PyPDF2 import PdfWriter, PdfReader

with open('demo.pdf', mode='rb') as f:
    content = io.BytesIO(f.read())
    original_pdf = PdfReader(content)

生成打印文字

原本 canvas.Canvas() 用於生成新的pdf,這邊則創建一個 BytersIO 丟進去

new_text = io.BytesIO()
page = canvas.Canvas(new_text, pagesize=A4)
page.drawString(100, 400, 'This is new text.')
page.save()

將打印文字加入原有檔案

這部份的做法是merge,顧名思義將要加入的文字融入目標頁面中,而要加入的文字本身也是印在一個頁面上。

updated_pdf = PdfWriter()
merge_text = PdfReader(new_text)

target_page = original_pdf.pages[0]
target_page.merge_page(merge_text.pages[0])

updated_pdf.add_page(target_page)

生成新檔案

接著要生成打印文字後的檔案,須先把檔案轉為 ByteIO 格式,再取出其中的值,寫入要輸出的檔案,即完成生成檔案。

output = io.BytesIO()
updated_pdf.write(output)

output_value = output.getvalue()
with open('updated_demo.pdf', mode='wb') as f:
    f.write(output_value)

此時點開路徑中剛生成的檔案,便會發現底下多了剛加入的文字囉

相關連結

Welcome to PyPDF2 - PyPDF2 documentation

Reportlab

Tags:
# python
# reportlab
# PyPDF2