日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python精彩案例】随拍文档转PDF扫描版

發(fā)布時間:2023/12/31 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python精彩案例】随拍文档转PDF扫描版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在需要掃描文件時,附近沒有打印店怎么辦?今天分享如何使用Python實現(xiàn)文檔轉pdf掃描。

老規(guī)矩,在進入正文之前,咱們先看看最終效果:

1 文檔矯正

如下圖所示,手持相機拍攝出來的圖片一般都是不標準的矩形。

需要通過技術手段將其矯正為標準的矩形,通過透視投影變換可以將任意四邊區(qū)域內容投影到另一個四邊形區(qū)域。


首先確定需要變換的4個點,然后確定投影后的4個點,可以得到一個變換矩陣,最后通過調用opencv的warpPerspective即可實現(xiàn)矯正。

投影后的四個點其實只需通過寬高即可確定,因為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]??梢愿鶕嶋H的文檔寬高設置投影變換后的尺寸,這里設置為寬度為515, 高度為663。

def warp(src, dst, src_pts, dw, dh):img = cv2.imread(src)dst_w = int(dw)dst_h = int(dh)src_pts = np.float32(src_pts)dst_pts = np.float32([[0, 0], [dst_w, 0], [dst_w, dst_h], [0, dst_h]])M = cv2.getPerspectiveTransform(src_pts, dst_pts)img = cv2.warpPerspective(img, M, [dst_w, dst_h], flags=cv2.INTER_CUBIC)cv2.imwrite(dst, img)

src, dst, src_pts, dw, dh分別表示輸入圖路徑、矯正后圖路徑、原始四個點,目標寬高。將各個參數(shù)傳入如上函數(shù),得到矯正后圖如下:

2 創(chuàng)建PDF文件并添加圖片

有了矯正后的圖片,接下來任務是創(chuàng)建PDF文件并將圖片插入到PDF文件中。

2.1 創(chuàng)建PDF

首先通過pip install reportlab安裝reportlab庫。接下來創(chuàng)建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 cvs

reportlab.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 A4

2.2 插入圖片

調用Canvas的drawImage函數(shù)實現(xiàn)圖像插入。并最后通過save函數(shù)保存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也是輕松可以實現(xiàn):

cvs.drawString(x, y, "hello world")

創(chuàng)建新一頁:

cvs.showPage()

調用showPage函數(shù)后,如果后面還有新的添加元素,則會開啟新的一頁,并添加到新的一頁上。更多細節(jié),可以參考https://www.reportlab.com/docs/reportlab-userguide.pdf

完整代碼關注【Python學習實戰(zhàn)】公眾號,回復2202獲取完整的代碼。

歡迎關注我【Python學習實戰(zhàn)】,每天學習一點點,每天進步一點點。

總結

以上是生活随笔為你收集整理的【Python精彩案例】随拍文档转PDF扫描版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。