1. 程式人生 > >用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

用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

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

因為我們上傳的PDF檔案會臨時存放在media資料夾,所以請在mypdfproject目錄下建一個media資料夾,並在settings.py檔案裡設定為MEDIA_ROOT。我們還會用到css檔案來美化網頁,所以也請中設定好靜態檔案的STATIC_URL和STATIC_ROOT.

#mypdfproject/settings.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

同時別忘了了把我們app的urls也加到專案的urls.py裡去。別忘了結尾的+static哦,否則媒體檔案無法正確顯示。

#mypdfproject/urls.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

URLConf配置與表單

在pdf檔案目錄下建立一個urls.py, 新增如下程式碼。一共有4個urls, 分別對應PDF單頁提取,PDF按頁面範圍連續提取, PDF合併與PDF替換。

# pdf/urls.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

另外我們還需要定義一些表單供使用者上傳PDF檔案和輸入頁碼,這些表單我們視圖裡會用到。

#pdf/forms.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

檢視: PDF單頁提取

我們先看下PDF單頁提取對應檢視方法pdf_single_page_extract的工作原理。使用者上傳PDF檔案和一串用逗號隔開的數字後,該方法先用split方法轉化為頁碼列表,再依次利用PyPDF2提取對應頁碼PDF頁面,分別將每個提取的單頁寫入media資料夾。最後用zipfile將所有寫入的PDF檔案壓縮成zip包,通過FileResponse方法返回給客戶。

# pdf/views.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

檢視: PDF頁面按範圍提取

# pdf/views.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

檢視: PDF文件合併

# pdf/views.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

檢視: PDF替換

# pdf/views.py

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

模板

#pdf/templates/pdf/pdf_extract.html

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

#pdf/templates/pdf/pdf_range_extract.html

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

#pdf/templates/pdf/pdf_merge.html

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

#pdf/templates/pdf/pdf_replace.html

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

#pdf/templates/pdf/base.html

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

實戰效果

最後本專案展示效果如下,完美地實現了PDF頁面的提取,合併和替換。唯一不足的是PyPDF2不支援中文命名的PDF檔案讀取, 所以還需進一步改進(注意: 中文PDF也支援的,只要檔名是英文就ok了)。

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

用Python開發PDF編輯器,實現PDF頁面提取,頁面合併與替換

 

GitHub原始碼地址

https://github.com/shiyunbo/django-pypdf2-pdf-extract-merge-replace

更多Python視訊、原始碼、資料加群960410445免費獲取

最後

本例是個不錯的django練習專案哦,你不僅可以學習到表單和模板的使用,還可以瞭解django如何藉助其它python庫開發有趣有用的專案。除此以外你會對zipfile和PyPDF2有更深層次的瞭解。如果喜歡本文,就給點個贊吧。