技术标签: python pdf ocr识别
在你的代码中,你正在提取文本,但是你不会做任何事情.
尝试这样的东西:
def extract_txt(file_path):
text = textract.process(file_path, method='tesseract')
outfn = file_path[:-4] + '.txt' # assuming filenames end with '.pdf'
with open(outfn, 'wb') as output_file:
output_file.write(text)
return file_path
这将文本写入具有相同名称但扩展名为.txt的文件.
它还返回原始文件的路径,让父母知道此文件已完成.
所以我会将映射代码更改为:
p = multiprocessing.Pool()
file_path = ['/Users/user/Desktop/sample.pdf']
for fn in p.imap_unordered(extract_txt, file_path):
print('completed file:', fn)
>创建池时不需要提供参数.默认情况下,它将创建与cpu内核一样多的工作人员.
>使用imap_unordered创建一个迭代器,一旦它们可用就开始生成值.
>因为worker函数返回了文件名,所以你可以打印它来让用户知道这个文件是完成的.
编辑1:
另外一个问题是是否可以标记页边界.我觉得是这样的.
一个确定工作的方法是将PDF文件分割成OCR之前的页面.你可以使用例如pdfinfo从poppler-utils包中找出文档中的页数.然后你可以使用例如pdfs从同一个poppler-utils包中分离出来,将N页的一个pdf文件转换成一页的N个pdf文件.然后,您可以单独OCR单页PDF文件.这将分别给您每个页面上的文本.
或者,您可以OCR整个文档,然后搜索分页符.如果文档在每个页面上都有一个常量或可预测的页眉或页脚,这将只起作用.它可能不如上述方法那么可靠.
编辑2:
如果需要一个文件,请写一个文件:
from PyPDF2 import PdfFileWriter, PdfFileReader
import textract
def extract_text(pdf_file):
inputpdf = PdfFileReader(open(pdf_file, "rb"))
for i in range(inputpdf.numPages):
w = PdfFileWriter()
w.addPage(inputpdf.getPage(i))
outfname = 'page{:03d}.pdf'.format(i)
with open(outfname, 'wb') as outfile: # I presume you need `wb`.
w.write(outfile)
print('page', i)
text = textract.process(outfname, method='tesseract')
# Add header and footer.
text = '\n'.format(i) + text + '\n'.format(i)
# Write the OCR-ed text to a file for each page.
with open('page{:03d}.txt'.format(i), 'w') as textfile: # might need 'wb' depending on what textract puts out.
textfile.write(text)
os.remove(outfname) # clean up.
print(text)
1. vector(动态数组)vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含头文件:#include<vector>;一、vector 的初始化:可以有五种方式,举例说明如下: (1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。 (2)vector<..._vector定义动态数组
一种通过自动脚本抓取Android 手机log的方法 作者:Amour.Wang 对于android 手机调试或测试中经常需要查看手机的logcat 输出,对于开发者平时一般都是直接使用IDE 查看logcat 输出,但是在有些情况下比如:1.单纯做测试,IDE 工具保存比较麻烦,或者没有IDE 工具的情况下,这时如果需要抓手机log 就比较麻烦。 本文主要针对在没有安装andro
数据结构实验之图论四:迷宫探索Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^题目描述有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点?输入连续T组数据输入,每组数据第一行给出三
题目描述存在actor表,包含如下列信息:CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5) NOT NULL PRIMARY KEY,first_name varchar(45) NOT NULL,last_name varchar(45) NOT NULL,last_update timestamp NOT NULL DEFAU..._数据库新增一列
1.安装npm install --save qrcode2.引入<el-button type="primary" style="float:right" @click="downLoad">立即下载</el-button>import QRCode from 'qrcodejs2' data() { return { callUrl:'https://www.baidu.com/' } },created() {
标注工具labelimg/labelme的对比评测_labelimg优点
问题引出:python中list.index()可以返回获得一个数据的索引值,但是有两个相同的值,只会返回第一个数据的索引>>> s = [11, 22, 33, 44, 22, 11]>>> s.index(11)0>>> s.index(22)1>>> from collections import defa..._python 数组 index
MNIST手写数字识别_qt手写板mnist
1.相对路径 (1).如果源文件跟所引用的js文件在同一目录中,直接写上js的文件名就可以了 例如: (2).如果源文件所引用的js文件是在当前目录下的子目录中。直接写上js文件所在的文件夹的名字跟js文件名 例如: (3).如果源文件所引用的js文件是在上一级的目录中。使用../返回到上一级目录在写上js文件名 例如: (4).如果想引用上两级目录,可以..\..\_src引用本地文件
DFS安装配置好后就要开始配置CRM基于内部认证访问的配置,即使用HTTPS在CRM服务器进行访问的设置。在CRM服务器中找到Dynamic CRM部署管理器,开始菜单选择Dynamic CRM部署管理器打开后点击右侧菜单属性切到WEB地址输入INTERNALCRM.你的域名.COM,红色部分为域,替换成自己创建的域就可以了。这里没有加端口是因为CRM服务器IIS配置的HTTPS网站..._dynamics basic认证
使用命令sudo apt --fix-broken install
offsetof介绍size_t offsetof( structName, memberName )功能:计算结构体成员相对于起始位置的偏移量返回值:返回结构体成员相对于起始位置的偏移量模拟实现把结构体的初始地址设置为0,此时结构体成员的地址大小就是它所对应的偏移量#define MY_OFFSETOF(structName,memberName) (unsigned int)&(((structName*)0)->memberName)测试#include<st_c语言结构体成员地的地址为0