前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Python精彩案例】随拍文档转PDF扫描版

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

原创
作者头像
superhua
发布于 2022-01-20 03:34:08
发布于 2022-01-20 03:34:08
1.7K01
代码可运行
举报
文章被收录于专栏:CNNCNN
运行总次数:1
代码可运行

在需要扫描文件时,附近没有打印店怎么办?今天分享如何使用Python实现文档转pdf扫描。

老规矩,在进入正文之前,咱们先看看最终效果:

图片转扫描pdf
图片转扫描pdf

1 文档矫正

如下图所示,手持相机拍摄出来的图片一般都是不标准的矩形。

随拍照片
随拍照片

需要通过技术手段将其矫正为标准的矩形,通过透视投影变换可以将任意四边区域内容投影到另一个四边形区域。

投影变换
投影变换

首先确定需要变换的4个点,然后确定投影后的4个点,可以得到一个变换矩阵,最后通过调用opencvwarpPerspective即可实现矫正。

投影后的四个点其实只需通过宽高即可确定,因为4个点位置为(0,0)(w,0)(w,h)(0,h)。那么如何确定输入的4个点呢?这里简单写了个图片显示:

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
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已经提供了常用的尺寸如:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from reportlab.lib.pagesizes import A4

2.2 插入图片

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

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def insert_imgs(cvs, img_path, rect):
    x, y, w, h = rect
    cvs.drawImage(img_path, x, y, width=w, height=h)
    cvs.save()
pdf效果
pdf效果

2.3 其他功能

不仅仅是插入图片,对于插入文字,reportlab也是轻松可以实现:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
cvs.drawString(x, y, "hello world")

创建新一页:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
cvs.showPage()

调用showPage函数后,如果后面还有新的添加元素,则会开启新的一页,并添加到新的一页上。更多细节,可以参考https://www.reportlab.com/docs/reportlab-userguide.pdf

完整代码关注【Python学习实战】公众号,回复2202获取完整的代码。

欢迎关注我【Python学习实战】,每天学习一点点,每天进步一点点。

长按关注【Python学习实战】
长按关注【Python学习实战】

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用Python生成pdf文件
    Python平台的优秀PDF报表类库Reportlab。它不属于Python的标准类库,所以必须手动下载类库包并安装:       yum install python-reportlab -y     这篇文章将介绍reportlab中基本常用的api,使用canvas画出一份整洁的PDF报表。详细内容参考reportlab的官方user guide。
py3study
2020/01/06
3.3K0
空间变换是什么_信号与系统状态转移矩阵
文章提出的STN的作用类似于传统的矫正的作用。比如人脸识别中,需要先对检测的图片进行关键点检测,然后使用关键点来进行对齐操作。但是这样的一个过程是需要额外进行处理的。但是有了STN后,检测完的人脸,直接就可以做对齐操作。关键的一点就是这个矫正过程是可以进行梯度传导的。想象一下,人脸检测完了,直接使用ROI pooling取出人脸的feature map,输入STN就可以进行矫正,输出矫正后的人脸。后面还可以再接点卷积操作,直接就可以进行分类,人脸识别的训练。整个流程从理论上来说,都有梯度传导,理论上可以将检测+对齐+识别使用一个网络实现。当然实际操作中可能会有各种trick。
全栈程序员站长
2022/11/02
1K0
空间变换是什么_信号与系统状态转移矩阵
python图片转换pdf
#!/home/chao/anaconda3/envs/test_py2/bin/python #coding:utf-8 import os import sys from reportlab.lib.pagesizes import A4, landscape from reportlab.pdfgen import canvas from PIL import Image from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont #需要预告安装支持中文的字体,如simfang从win拷贝过来安装 def createPdf(dstpath,fileList):     img = Image.open( fileList[0].decode('UTF-8') )     c = canvas.Canvas(dstpath, img.size)#第一张图片的尺寸新建pdf     pdfmetrics.registerFont(TTFont('simfang','simfang.ttf')) #注册字体     fontheight=15     c.setFont('simfang',fontheight)     #c.drawString(100, 300, u'宋体宋体')     height=fontheight     num=1     for i in fileList:#标明本pdf的文件列表         c.drawString(fontheight,height,str(num)+"/"+str(len(fileList)))         c.drawString(fontheight+50, height, os.path.split(i)[1])         num+=1         height+=fontheight     c.showPage()     for i in fileList:         c.drawImage(i.decode('UTF-8'), 0, 0)#转换为中文路径名称打开         c.showPage()     c.save() def transferPdf(filePath,dstpath): #将一个目录下所有图片生成一个pdf     fileList=[]     #result=os.popen(" ls -l "+filePath+"| awk \'{print $9}\' | sort -t _ -k1,1 -k2n,2 ").read()     result=os.popen(" ls  "+filePath+"|  sort -t _ -k1,1 -k2n,2 ").read()     currentIndex=0     pdfIndex=0     for i in result.split("\n"):         if i.strip()!='':             print i             fileList.append(os.path.join(filePath, i))             currentIndex+=1             if currentIndex == 100:#每几页一创建                 currentIndex=0                 pdfIndex+=1                 createPdf( os.path.join(dstpath, str(pdfIndex)+".pdf") ,fileList)                 fileList=[] filePath = "/home/chao/img"#源图片文件夹 dstpath="/home/chao/tmp1"#转换出的pdf文件夹存放地址 transferPdf(filePath,dstpath)
py3study
2020/01/08
1.6K0
python3图片裁剪+转换pdf+压缩
本地大量长图,要发送给别人,所以要对图片进行裁剪+转换pdf+压缩 1 import zipfile 2 import os 3 from concurrent.futures import ThreadPoolExecutor 4 from reportlab.lib.pagesizes import A4, landscape 5 from reportlab.pdfgen import canvas 6 from PIL import Image 7 import time
机器学习和大数据挖掘
2019/07/02
1.2K0
单应性Homograph估计:从传统算法到深度学习
单应性原理被广泛应用于图像配准,全景拼接,机器人定位SLAM,AR增强现实等领域。这篇文章从基础图像坐标知识系为起点,讲解图像变换与坐标系的关系,介绍单应性矩阵计算方法,并分析深度学习在单应性方向的进展。
3D视觉工坊
2020/11/11
2.1K0
单应性Homograph估计:从传统算法到深度学习
python 图片转 pdf
from reportlab.lib.pagesizes import A4, landscape
py3study
2020/01/06
2.4K0
火星表面...
今天,看到了于老师发表了一篇文章,《我为中国火星第一图做鱼眼矫正》。各位可以先去看看于老师的文章,于老师也很大方的开了自己的code。于老师代码写的很简洁,效果也很好。其中代码效果如下所示,展示了火星表面是什么样的:
灿视学长
2021/05/28
1.8K0
python中解析和生成pdf文件
python中可以对pdf文件进行解析和生成,分别需要安装pdfminer/pdfminer3k和reportlab文件库。
py3study
2020/01/08
2.7K0
Python添加pdf水印
3、这种方式唯一的缺点就是效率极低,不适合大批量文件处理。用PDFlib处理效率会比这种方式高几十倍。可参考:用PDFlib给PDF添加水印(Python)
py3study
2020/01/07
1.6K0
深度学习教你重建赵丽颖的三维人脸
近年来,三维人脸重建成为计算机视觉、图像识别等研究领域中的热点问题。三维人脸重建技术分为基于不同视角的多幅图像的重建和基于单幅图像的三维人脸重建。
AI科技大本营
2021/07/12
1.2K0
【论文复现】进行不同视角图像的拼接
无论对于日常的娱乐需求还是一些专业性的测绘工作,都需要我们基于这些“残缺”的图片来构建出完整的图像。
Eternity._
2024/12/28
1940
【论文复现】进行不同视角图像的拼接
【OpenCV】Chapter3.图像的仿射变换
仿射变换其实包含了一系列的操作:平移,缩放,旋转等,不过所有的操作都可以通过这个仿射变换矩阵来实现。
zstar
2022/09/22
1.3K0
【OpenCV】Chapter3.图像的仿射变换
【Python】给PDF添加水印
利用 PyPDF2 处理 PDF 文件,相关文档:https://pythonhosted.org/PyPDF2/
AXYZdong
2021/01/24
5.9K2
Python OpenCV3 计算机视觉秘籍:6~9
变量之间的线性相关性是所有可能选项中最简单的。 从近似和几何任务到数据压缩,相机校准和机器学习,它可以在许多应用中找到。 但是,尽管它很简单,但是当现实世界的影响发挥作用时,事情就会变得复杂。 从传感器收集的所有数据都包含一部分噪声,这可能导致线性方程组具有不稳定的解。 计算机视觉问题通常需要求解线性方程组。 即使在许多 OpenCV 函数中,这些线性方程也是隐藏的。 可以肯定的是,您将在计算机视觉应用中面对它们。 本章中的秘籍将使您熟悉线性代数的方法,这些方法可能有用并且实际上已在计算机视觉中使用。
ApacheCN_飞龙
2023/04/27
2.6K0
Python OpenCV3 计算机视觉秘籍:6~9
实战角度!图片去水印及图片匹配替换几种方法分析
最近手上有一批图片需要去水印,同时也要对于大图中某个小部分做替换。之前网站的很多图片水印的处理方式都比较简单粗暴,确定水印加在图片上的大致位置,然后做一个不透明度100%的图片覆盖上去,完美解决问题,但是不理想的地方也显而易见,用户观感特别不好。所以,借着这次处理的机会,想把问题根除掉。本文会分四部分,零部分(你没有看错!)主要是自己尝试的路径,如果想简单直接,不失为一种有效方式。第一部分把可以应用的计算机视觉领域可能会用到的算法或者对思路有拓展的算法进行总结,同时对于有些算法的使用过程中遇到的问题,结合我自己的实战经验给出一些实践避坑指南。第二部分,对应第一部分的总结,会给出通用的实现demo,第三部分,会对本文进行总结,相信你在图片匹配替换或者去水印领域遇到相关问题,我的文章都能给你些许思路。
用户1413827
2023/11/28
4680
实战角度!图片去水印及图片匹配替换几种方法分析
PDF批量加水印 与 去除水印实践
本文主要目标是尝试去除水印,但是为了准备测试‍数据,我们需要先准备好有水印的pdf测试文件。
可以叫我才哥
2024/06/18
2940
PDF批量加水印 与 去除水印实践
扫描全能王?原来图像技术可以这样子玩
不知道大家会不会有这种感觉,经常是觉得自己学的技术没有用,担心自己能不能胜任工作。因为我们通常学的都是基础的,老师教完之后做几道题目会做考试过了代表学过了。
AI算法与图像处理
2019/07/11
2.1K0
扫描全能王?原来图像技术可以这样子玩
[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。
Eastmount
2022/11/25
2.5K0
相机标定的原理及实现
本文参考文档: 原理部分:https://blog.csdn.net/honyniu/article/details/51004397 代码部分:https://www.cnblogs.com/wildbloom/p/8320351.html ;https://blog.csdn.net/firemicrocosm/article/details/48594897#
全栈程序员站长
2022/09/01
2.1K0
万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文
期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
全栈程序员站长
2022/11/04
2.1K0
万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文
推荐阅读
相关推荐
使用Python生成pdf文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验