【Python精彩案例】随拍文档转PDF扫描版
在需要掃描文件時,附近沒有打印店怎么辦?今天分享如何使用Python實現文檔轉pdf掃描。
老規矩,在進入正文之前,咱們先看看最終效果:
1 文檔矯正
如下圖所示,手持相機拍攝出來的圖片一般都是不標準的矩形。
需要通過技術手段將其矯正為標準的矩形,通過透視投影變換可以將任意四邊區域內容投影到另一個四邊形區域。
首先確定需要變換的4個點,然后確定投影后的4個點,可以得到一個變換矩陣,最后通過調用opencv的warpPerspective即可實現矯正。
投影后的四個點其實只需通過寬高即可確定,因為4個點位置為(0,0)、(w,0)、(w,h)、(0,h)。那么如何確定輸入的4個點呢?這里簡單寫了個圖片顯示:
from matplotlib import pyplot as plt def show_img(path):img = plt.imread(path)plt.imshow(img)plt.show()鼠標移動到圖像各個位置時,右下角會顯示當前點坐標。如下圖所示:
找到左上、右上、右下、左下四個點位置分別為[400, 703], [2384, 656], [2635, 3280], [294, 3357]。可以根據實際的文檔寬高設置投影變換后的尺寸,這里設置為寬度為515, 高度為663。
src, dst, src_pts, dw, dh分別表示輸入圖路徑、矯正后圖路徑、原始四個點,目標寬高。將各個參數傳入如上函數,得到矯正后圖如下:
2 創建PDF文件并添加圖片
有了矯正后的圖片,接下來任務是創建PDF文件并將圖片插入到PDF文件中。
2.1 創建PDF
首先通過pip install reportlab安裝reportlab庫。接下來創建PDF:
from reportlab.lib.pagesizes import A4 from reportlab.pdfgen import canvasdef create_pdf(filename, width_height=A4):cvs = canvas.Canvas(filename, pagesize=width_height)return cvsreportlab.pdfgen生成PDF文件,將PDF看成是一個畫板Canvas。Canvas可以指定頁面的寬高。但需要注意,這里的寬高是以點為單位。關于點的單位換算如下:
- 1 inch = 72 點
- 1 inch = 25.4 mm
因此,我們可以輕易得到毫米(mm)轉點單位換算:
- 1 mm = 72/25.4 點
對于A4紙張,其寬高分別為210 mm和297 mm。當然了,reportlab已經提供了常用的尺寸如:
from reportlab.lib.pagesizes import A42.2 插入圖片
調用Canvas的drawImage函數實現圖像插入。并最后通過save函數保存pdf文件
def insert_imgs(cvs, img_path, rect):x, y, w, h = rectcvs.drawImage(img_path, x, y, width=w, height=h)cvs.save()2.3 其他功能
不僅僅是插入圖片,對于插入文字,reportlab也是輕松可以實現:
cvs.drawString(x, y, "hello world")創建新一頁:
cvs.showPage()調用showPage函數后,如果后面還有新的添加元素,則會開啟新的一頁,并添加到新的一頁上。更多細節,可以參考https://www.reportlab.com/docs/reportlab-userguide.pdf
完整代碼關注【Python學習實戰】公眾號,回復2202獲取完整的代碼。
歡迎關注我【Python學習實戰】,每天學習一點點,每天進步一點點。
總結
以上是生活随笔為你收集整理的【Python精彩案例】随拍文档转PDF扫描版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GaussDB Hash表分布列选择原则
- 下一篇: OctaneRender渲染器的硬件要求