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

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

【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。

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分别表示输入图路径、矫正后图路径、原始四个点,目标宽高。将各个参数传入如上函数,得到矫正后图如下:

2 创建PDF文件并添加图片

有了矫正后的图片,接下来任务是创建PDF文件并将图片插入到PDF文件中。

2.1 创建PDF

首先通过pip install reportlab安装reportlab库。接下来创建PDF

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
def create_pdf(filename, width_height=A4):
    cvs = canvas.Canvas(filename, pagesize=width_height)
    return cvs

reportlab.pdfgen生成PDF文件,将PDF看成是一个画板CanvasCanvas可以指定页面的宽高。但需要注意,这里的宽高是以为单位。关于的单位换算如下:

  • 1 inch = 72 点
  • 1 inch = 25.4 mm

因此,我们可以轻易得到毫米(mm)单位换算:

  • 1 mm = 72/25.4 点

对于A4纸张,其宽高分别为210 mm297 mm。当然了,reportlab已经提供了常用的尺寸如:

from reportlab.lib.pagesizes import A4

2.2 插入图片

调用CanvasdrawImage函数实现图像插入。并最后通过save函数保存pdf文件

def insert_imgs(cvs, img_path, rect):
    x, y, w, h = rect
    cvs.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获取完整的代码。

相关文章
|
3月前
|
数据采集 Python
Python实用记录(七):通过retinaface对CASIA-WebFace人脸数据集进行清洗,并把错误图路径放入txt文档
使用RetinaFace模型对CASIA-WebFace人脸数据集进行清洗,并将无法检测到人脸的图片路径记录到txt文档中。
64 1
|
3月前
|
Python
Python实用记录(六):如何打开txt文档并删除指定绝对路径下图片
这篇文章介绍了如何使用Python打开txt文档,删除文档中指定路径的图片,并提供了一段示例代码来展示这一过程。
41 1
|
17天前
|
存储 NoSQL 数据库连接
在Python程序中实现LevelDB的海量key的分批次扫描
通过本文的步骤,您可以在Python程序中实现对LevelDB海量key的分批次扫描。这样不仅能够有效地管理大规模数据,还可以避免一次性加载过多数据到内存中,提高程序的性能和稳定性。希望这篇指南能为您的开发工作提供实用的帮助。
60 28
|
1月前
|
编解码 人工智能 文字识别
用PDF转换图片的方式弥补通义千问在扫描版PDF支持方面的缺失
当前通义千问Web版和本地版qwen-VL在处理扫描版PDF时均无法直接识别,导致实际应用中处理大量扫描PDF的需求难以满足。为此,通过使用Python的pdf2image库,可将PDF文件转换为图片,再进行OCR处理,实现解决方案。文中提供了具体的代码示例,展示了如何将PDF文件的每一页转换成图片,并保存至指定文件夹,为后续的OCR处理做好准备。
|
3月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
232 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
3月前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
66 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
3月前
|
人工智能 开发者 Python
python读取word文档 | AI应用开发
在RAG系统中,构建知识库时需读取多种外部文档,其中Word文档较为常见。本文介绍如何使用`python-docx`库读取Word文档(.docx格式)中的标题、段落、表格和图片等内容。首先通过`pip install python-docx`安装库,然后利用提供的接口提取所需信息。尽管该库功能强大,但在识别标题样式时需自定义逻辑,并且仅提供图片的URI而非直接加载。示例代码展示了读取文本、识别标题、读取表格及获取图片URI的方法。【10月更文挑战第2天】
124 2
|
3月前
|
Python
Python对PDF文件页面的旋转和切割
Python对PDF文件页面的旋转和切割
61 3
|
3月前
|
数据采集 前端开发 NoSQL
Python编程异步爬虫实战案例
Python编程异步爬虫实战案例
90 2
|
3月前
|
数据采集 自然语言处理 API
Python反爬案例——验证码的识别
Python反爬案例——验证码的识别
60 2

热门文章

最新文章