ocr.ficapy.com 后台实现

发布在 python

因为个人需求,写了一个很小众的作品,https://ocr.ficapy.com,我给它起的项目名是pdfaddtext,用途是给扫描版本的PDF文件加上搜索功能。使用场景是我有几本扫描版本的PDF书籍(网上有特别多的扫描版书籍),有时候想搜索书中有没有提到某个知识点,纯图片是无法搜索的,你只能凭记忆去找。本项目作用就是将PDF的文本内容识别出来,然后写入一层隐藏的文字层,这样PDF阅读器就能够搜索这些文字了,同时尽量保证将识别出来的文字写到原图片对应的位置,类似的工具有OCRmyPDF,它的缺点很明显,使用Tesseract OCR引擎,对比识别效果,简直被商用OCR吊打。

最开始有了这个想法,我大概花费了一个下午的时间用python写出了基本的demo。将每一页PDF转换成图片,然后用免费的OCR服务去识别,得到结果,最后合并出一个新的pdf出来。过程算是比较顺利。本着独乐乐不如众乐乐的心态。我计划将它转变成一项web服务,于是挖坑之旅就此开始了

TLDR

阅读全文

Tornado 杂项

发布在 Tornado

Tornado系列基本介绍的差不多了,本篇介绍一些零散的东西。有了前面的知识,本篇会讲的比较粗略

阅读全文

Tornado 之queue

发布在 Tornado

介绍完StackContext、gen.engine、gen.coroutine之后Tornado3.0以前的核心内容基本已经完结了。本篇介绍一下gen.coroutine中Future的应用,在tornado中生成一个队列的数据结构。如果经常写web的情况,单单只处理用户的输入给出输出,那么要求不会太多,也不会用到队列。可是如果你去写一个爬虫,肯定需要限速啥的,此时队列就是一个很有用的东西,很容易实现生产者消费者模型。Tornado官方的demo中也有一个[爬虫代码(https://github.com/tornadoweb/tornado/blob/master/demos/webspider/webspider.py)]演示如何使用队列(本篇基于v5.0.0)

阅读全文

Tornado 之gen.coroutine

发布在 Tornado

2013年Tornado3.0版本。gen.coroutine上线,直到今天它依旧是目前Tornado中使用最为广泛的装饰器。同时它也是接替gen.engine的存在。它基本去掉了gen.Task的套路。相对gen.engine而言。它只需要gen.coroutine就够了,写法上更为美观

阅读全文

Tornado 之gen.engine

发布在 Tornado

Tornado在2011年的2.1版本加入了gen.engine模块,该模块主要为了解决异步程序编写不够优雅的问题。力图让使用者离callback更远,这也是Tornado厉害的地方。本来内部各种事件处理,callback满天飞,可是在用户眼里,它那个class Handler(web.RequestHandler)下面get的写法和同步写法差不多嘛。和同步的写法一样,获得了更高的性能,我想这也是为什么Tornado能出彩的地方吧(本文代码基于v2.3.0)

阅读全文

Tornado 之StackContext

发布在 Tornado

yield这个关键字在2001年2.2版本的时候就出现了。2006加入yield.send功能。然而直到2006年2.5版本才看到使用在contextmanager上,tornado 2011年才用它实现了神奇的gen逻辑。令我没想到的是

  1. yield出现的这么早
  2. yield厉害一点的应用(contentmanager)居然过了五年才加入到标准库。
  3. tornado的1.0.0版根本和yield没有一毛钱关系
  4. tornado最先引入yield居然并不是实现了gen

yield最先在tornado里面展露头角是在这个commit里面。大神就是大神,虽然这个代码仅仅只有几十行。可是我觉得思路很新奇,膜拜😀(代码基于v1.0.0和v1.1.0)

阅读全文

Tornado 之WSGI

发布在 Tornado

WSGI毕竟是Python社区官方认可的规范,可是这种规范在多线程多进程模式下实现很简单,不太适合单线程异步这种情况。鉴于此Tornado并没有按照这个框架去实现一个WSGI的web框架,可是它却提供了基本的兼容,1.允许Tornado的application对象转变成WSGI application。2. 允许WSGI application在tornado ioloop中执行,只是这一切都不是完美的,它仅仅提供了基本的兼容,效率和可用性得不到保证。因此个人还是感觉很鸡肋的

阅读全文

Tornado 之web

发布在 Tornado

上一篇文章讲解了httpserver。它最终传入的是一个函数,接受的是Request对象,这和Tornado所展示的Hello World有一些差距。tornado的web模块就是将它从一个函数变化成一个类对象,并且包含了基础的路由功能,最终实现类似与这样的Hello World(代码基于1.0.0版本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from tornado import web
from tornado import httpserver
from tornado import ioloop

class MainHandler(web.RequestHandler):
def get(self):
self.write(b"Hello World")

application = web.Application([
(r"/", MainHandler)
])

http_server = httpserver.HTTPServer(application)
http_server.listen(8888)
ioloop.IOLoop.instance().start()
阅读全文

Tornado 之httpserver

发布在 Tornado

Tornado可以当做一个http客户端去发送请求,可以处理需要和客户端建立长连接的请求。可是Tornado最为知名的还是它作为一个HTTP web框架…,上一篇讲述了IOLoop的套路。本篇讲解一下如何将IOLoop和httpserver联系起来(本代码思路依据1.0.0版本)

阅读全文

Tornado 之IOLoop

发布在 Tornado

这是Tornado系列的开篇,Tornado作为异步web框架2010年发布1.0版本。可以说Python社区搞了这么多年,为了获得比多线程多进程更高的性能,经历了Twisted、Tornado、yield、gevent、yield from、asyncio。也不知道什么时候才是一个尽头~~。Tornado过了这么多年还算开发活跃(一个大神扛起了一片天啊),不同于多线程模型的一潭死水,看它的代码你会发现它还是紧跟潮流的,而且有一点。它的内部虽然一直在变动,但是提供给用户的使用接口是很稳定的,后续就会发现这个坑有多大

阅读全文

ficapy

author.bio


author.job


深圳