【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获取完整的代码。

相关文章
|
7月前
|
XML 数据格式 Python
从手动编辑到代码生成:Python 助你高效创建 Word 文档
本文介绍如何用Python实现Word文档自动化生成,结合python-docx、openpyxl和matplotlib库,高效完成报告撰写、数据插入与图表生成,大幅提升办公效率,降低格式错误,实现数据驱动的文档管理。
1034 2
|
9月前
|
安全 JavaScript 开发者
Python 自动化办公神器|一键转换所有文档为 PDF
本文介绍一个自动化批量将 Word、Excel、PPT、TXT、HTML 及图片转换为 PDF 的 Python 脚本。支持多格式识别、错误处理与日志记录,适用于文档归档、报告整理等场景,大幅提升办公效率。仅限 Windows 平台,需安装 Office 及相关依赖。
515 0
|
7月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
8月前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
1333 0
|
8月前
|
设计模式 缓存 运维
Python装饰器实战场景解析:从原理到应用的10个经典案例
Python装饰器是函数式编程的精华,通过10个实战场景,从日志记录、权限验证到插件系统,全面解析其应用。掌握装饰器,让代码更优雅、灵活,提升开发效率。
599 0
|
10月前
|
Python
Python 办公实战:用 python-docx 自动生成 Word 文档
本文详解如何使用 python-docx 库实现 Word 文档自动化生成,涵盖环境搭建、文档创建、格式设置、表格与图片处理、模板填充、批量生成及性能优化等实战技巧,助你高效完成办公场景中的文档自动化任务。
2369 1
|
10月前
|
数据采集 存储 NoSQL
Python爬虫案例:Scrapy+XPath解析当当网网页结构
Python爬虫案例:Scrapy+XPath解析当当网网页结构
|
11月前
|
数据可视化 算法 数据挖掘
Python 3D数据可视化:7个实用案例助你快速上手
本文介绍了基于 Python Matplotlib 库的七种三维数据可视化技术,涵盖线性绘图、散点图、曲面图、线框图、等高线图、三角剖分及莫比乌斯带建模。通过具体代码示例和输出结果,展示了如何配置三维投影环境并实现复杂数据的空间表示。这些方法广泛应用于科学计算、数据分析与工程领域,帮助揭示多维数据中的空间关系与规律,为深入分析提供技术支持。
467 0
Python 3D数据可视化:7个实用案例助你快速上手
|
人工智能 编解码 文字识别
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
OCRmyPDF 是一款开源命令行工具,专为将扫描的 PDF 文件转换为可搜索、可复制的文档。支持多语言、图像优化和多核处理。
1475 17
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具

推荐镜像

更多