用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換
大多數PDF軟體閱讀服務是免費的,但是如果你想編輯一個PDF文件,比如從一個PDF文件中提取指定頁面,合併多個PDF頁面或者實現PDF頁面的替換,你一般需要購買收費軟體才可以。這當然難不倒程式設計師們,尤其Python程式設計師們。今天小編我就帶你利用Django+PyPDF2開發一個比較實用的小APP,實現PDF頁面線上提取, 頁面合併與頁面替換。文尾我們會附上GitHub原始碼地址。
專案開發總體思路
對於PDF頁面提取,我們的開發思路是這樣子的。我們設計一個表單,讓使用者上傳一個PDF檔案並輸入提取頁面號碼。伺服器在收到PDF檔案後使用PyPDF2讀取使用者上傳的PDF檔案,提取我們所需要的頁面,然後通過FileResponse將這個提取的PDF頁面通過瀏覽器返回給客戶。如果使用者輸入的是1,3,5,7這種頁碼,我們將逐一提取頁面,將所有提取頁面壓縮成一個zip包返回給使用者。
對於PDF合併,我們只需使用者一次上傳PDF檔案即可。對於PDF替換,我們需要使用者上傳替換頁,被替換的PDF檔案及被替換頁面號碼。
這個應用很簡單,並不需要建立什麼模型Models。重點要編寫的是檢視views.py, 用來處理使用者的請求。我們預計需要4個urls和4個對應的處理方法。
- PDF單頁提取(如1, 3, 5): pdf_single_page_extract
- PDF按頁面範圍連續提取(如2-8): pdf_range_extract
- PDF檔案合併: pdf_merge
- PDF檔案替換: pdf_replace
本例需要安裝如下兩個Python庫, 其中PyPDF2庫將負責PDF檔案讀取, 分割和合並工作。
Django==2.1.3 PyPDF2==1.26.0
專案設定
使用django-admin startproject mypdfproject建立一個名叫mypdfproject的專案,然後進入該目錄再使用python manage.py startapp pdf建立一個叫pdf的app,然後把這個app加入到你的mypdfproject/settings.py裡INSTALLED_APPS去。
#mypdfproject/settings.py
因為我們上傳的PDF檔案會臨時存放在media資料夾,所以請在mypdfproject目錄下建一個media資料夾,並在settings.py檔案裡設定為MEDIA_ROOT。我們還會用到css檔案來美化網頁,所以也請中設定好靜態檔案的STATIC_URL和STATIC_ROOT.
#mypdfproject/settings.py
同時別忘了了把我們app的urls也加到專案的urls.py裡去。別忘了結尾的+static哦,否則媒體檔案無法正確顯示。
#mypdfproject/urls.py
URLConf配置與表單
在pdf檔案目錄下建立一個urls.py, 新增如下程式碼。一共有4個urls, 分別對應PDF單頁提取,PDF按頁面範圍連續提取, PDF合併與PDF替換。
# pdf/urls.py
另外我們還需要定義一些表單供使用者上傳PDF檔案和輸入頁碼,這些表單我們視圖裡會用到。
#pdf/forms.py
檢視: PDF單頁提取
我們先看下PDF單頁提取對應檢視方法pdf_single_page_extract的工作原理。使用者上傳PDF檔案和一串用逗號隔開的數字後,該方法先用split方法轉化為頁碼列表,再依次利用PyPDF2提取對應頁碼PDF頁面,分別將每個提取的單頁寫入media資料夾。最後用zipfile將所有寫入的PDF檔案壓縮成zip包,通過FileResponse方法返回給客戶。
# pdf/views.py
檢視: PDF頁面按範圍提取
# pdf/views.py
檢視: PDF文件合併
# pdf/views.py
檢視: PDF替換
# pdf/views.py
模板
#pdf/templates/pdf/pdf_extract.html
#pdf/templates/pdf/pdf_range_extract.html
#pdf/templates/pdf/pdf_merge.html
#pdf/templates/pdf/pdf_replace.html
#pdf/templates/pdf/base.html
實戰效果
最後本專案展示效果如下,完美地實現了PDF頁面的提取,合併和替換。唯一不足的是PyPDF2不支援中文命名的PDF檔案讀取, 所以還需進一步改進(注意: 中文PDF也支援的,只要檔名是英文就ok了)。
GitHub原始碼地址
https://github.com/shiyunbo/django-pypdf2-pdf-extract-merge-replace
更多Python視訊、原始碼、資料加群960410445免費獲取
最後
本例是個不錯的django練習專案哦,你不僅可以學習到表單和模板的使用,還可以瞭解django如何藉助其它python庫開發有趣有用的專案。除此以外你會對zipfile和PyPDF2有更深層次的瞭解。如果喜歡本文,就給點個贊吧。