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
打印文字需分為四個步驟
- 讀取原有檔案
- 生成打印文字
- 將打印文字加入原有檔案
- 生成新檔案
讀取原有檔案
先以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)
此時點開路徑中剛生成的檔案,便會發現底下多了剛加入的文字囉