谢作如 谢集
扫描仪是办公室中最常见的设备之一。虽然智能手机上配置的摄像头像素越来越高,人们习惯于用“随手一拍”来替代过去的“扫描”动作,但毕竟拍摄的效果不好,得到的图片往往不够平整。笔者学校创客空间中有一台爱普生扫描仪,虽然平时用处不大,但关键时刻总需要它的帮忙。为了方便使用,我们希望将其设置为网络共享,随时随处可以使用,最大限度地提升其利用率。
2020年3月,我们曾经利用虚谷号和Python将家里的惠普一体机(型号为“M126a”)改造为网络版的一体机,使其支持远程打印、远程扫描等功能。但是很遗憾,我们暂时找不到这台爱普生扫描仪在arm64系统下的驱动程序,只能将其安装在X86架构下的拿铁熊猫上,经过一番折腾,总算实现了多人共享,普通扫描仪变身为网络扫描仪(如图1)。
● 思路分析
因为之前已经成功地在一体机上实现网络扫描的功能,我们再次选择这样的做法,即利用Python写一个Web服务器,通过访问网页来操作扫描仪,具体方法如下:
用Python的Flask框架写一个Web服务器,运行在连接扫描仪的迷你电脑上。用户通过网页发送扫描命令,Python将调用系统的命令驱动扫描仪,得到图片后再借助格式转换工具转化为JPEG格式,最后通过网页显示图片,提示用户下载。这一过程描述起来有点复杂,但执行速度其实很快,而且对用户来说过程“透明”:点击网页的“扫描”按钮,一会儿就能得到图片,是很好的体验。基于Web的扫描仪应用系统的运行流程如图2所示。
这一做法的优势很明显,只要能上网的终端都可以使用,操作非常简单,部署起来也方便。创客空间中有各种迷你电脑或者闲置的电脑,只要装上Linux系统,配置好扫描仪的驱动即可。至于为什么要选择Linux,是因为Linux下有支持命令行的扫描仪软件scanimage和格式轉换软件imagemagick。在Windows下,类似功能的软件很难找到。
● 程序实现
Flask是Python的轻量级Web开发框架,也是浙教版必修二《信息系统与社会》模块的教学内容之一。
1.功能测试
先在Jupyter上编写代码,模拟一下核心功能,即扫描。
启动扫描命令(如图3)。
图片转换命令(如图4)。
很顺利,一张图片就出来了,Python就这么神奇。
2.代码编写
借助教材中的案例,我们开发了一个很简单的Web应用。核心代码仅仅一个文件——webscan.py。如图5所示,“templates”中是作为模板的两个静态网页。“static”中放两个js文件,借助jquery实现了文件列表的排序功能。“static”文件中的scan文件夹,则用来存放扫描文件(如图6)。
“webscan.py”代码中加了如下几条路由,具体介绍如下页表所示。
限于篇幅,下页图7的代码仅仅提供了扫描功能的部分,如果需要完整代码和相关的网页模板(“index.html”和“list.html”文件),请访问虚谷号的GitHub,或者向编辑索取。
● 系统应用
这个基于Web的扫描仪应用系统,最后命名为“WebScan”。代码用vscode编写,在Anaconda、mPython等环境中测试通过,支持Python3.5及以上版本。在虚谷号、MacOS和Ubuntu等系统上都能成功部署(如下页图8)。
客户端使用Chrome、Safari、Edge和Firefox等浏览器,都能够正常访问。同样,在手机上访问、操作也很正常。
1.扫描文件(如下页图9)
2.浏览文件(如下页图10)
我们把Web服务器的地址做成二维码贴在扫描仪上面,手机一扫就打开页面,然后开始操作,非常方便。
● 拓展思考
在京东和淘宝上,我们都没有找到价格在1000元内的具备网络共享功能的平板扫描仪。具备网络功能的,要么是高拍仪,要么是动辄上万的高速扫描仪。将办公室中的普通扫描仪配上迷你电脑,然后放在学校的公用办公区域,方便师生们使用,应该是一个不错的创意应用。
想象一下,教师们带着文稿走到扫描仪前面,放好,然后拿出手机扫一下二维码。点击网页上的按钮,十几秒钟后,扫描的图片就到了手机里了。这不是很方便吗?学生没有手机怎么用呢?比如插上U盘,按下按钮开始扫描,扫描图片直接存入U盘带走。要实现这样的功能,编程起来也很简单。有了Python,解决这些问题一点都不困难。