我有一个包含PDF文件(图像)的大目录,如何有效地从目录中的所有文件中提取文本?。到目前为止,我试图:
导入多处理
导入文本摘要
def extract_txt(文件路径):
text=textract.process(文件路径,方法=’tesseract’)
p=多处理池(2)
文件路径=[‘/Users/user/Desktop/sample.pdf’]
列表(p.map(提取文本、文件路径))
但是,它不起作用。。。这需要很多时间(我有一些600页的文档)。另外:a)我不知道如何有效地处理目录转换部分。b) 我想添加一个页面分隔符,比如:<;开始/年龄=1>。。。页面内容&书信电报;结束/页码=1>,但我不知道怎么做
因此,如何将extract_txt函数应用于以.pdf结尾的目录的所有元素,并以.txt格式返回另一个目录中的相同文件,以及添加带有OCR文本提取的页面分隔符
另外,我对使用GoogleDocs来完成这个任务很好奇,是否可以通过编程使用GoogleDocs来解决前面提到的文本提取问题
更新
关于“添加页面分隔符”问题(<;开始/age=1>;…页面内容…<;结束/page=1>;),在阅读罗兰·史密斯的答案后,我试图:
从PyPDF2导入PdfileWriter、PdfileReader
导入文本摘要
def extract_文本(pdf_文件):
inputpdf=PdfileReader(打开(pdf文件,“rb”))
对于范围内的i(inputpdf.numPages):
w=PdfileWriter()
w、 addPage(inputpdf.getPage(i))
outfname='page{:03d}.pdf'。格式(一)
使用open(outname,'wb')作为outfile:#我想您需要'wb'。
w、 写入(输出文件)
打印(“\n<;开始页位置=”,i,“>;\n”)
text=textract.process(str(outname),method='tesseract')
os.移除(outname)#清理。
打印(str(文本“utf8”))
打印('\n<;结束页位置=',i'>;\n')
提取文本('/Users/user/Downloads/ImageOnly.pdf')
但是,print()部分仍然存在问题,因为与其打印,不如将所有输出保存到一个文件中。因此,我尝试将输出重定向到一个文件:
sys.stdout=open(“test.txt”、“w”)
打印(“\n<;开始页位置=”,i,“>;\n”)
sys.stdout.close()
text=textract.process(str(outname),method='tesseract')
os.移除(outname)#清理。
sys.stdout=open(“test.txt”、“w”)
打印(str(文本“utf8”))
sys.stdout.close()
sys.stdout=open(“test.txt”、“w”)
打印('\n<;结束页位置=',i'>;\n')
sys.stdout.close()
你知道如何使用页面提取/分隔符技巧并将所有内容保存到文件中吗
在您的代码中,您正在提取文本,,但您没有对其执行任何操作
试着这样做:
def extract\u txt(文件路径):
text=textract.process(文件路径,方法='tesseract')
outfn=file_path[:-4]+'.txt'#假设文件名以'.pdf'结尾
将open(OUTN,'wb')作为输出_文件:
输出_文件。写入(文本)
返回文件路径
这会将文本写入具有相同名称但扩展名为.txt的文件
它还返回原始文件的路径,以让父级知道此文件已完成
因此,我将映射代码更改为:
p=multiprocessing.Pool()
文件路径=['/Users/user/Desktop/sample.pdf']
对于p.imap\u无序中的fn(提取\u txt,文件\u路径):
打印('已完成文件:',fn)
- 创建
池时,不需要提供参数。默认情况下,它将创建与cpu核心数量相同的工作线程 - 使用
imap_unordered创建迭代器,该迭代器在值可用时立即开始生成值 - 因为worker函数返回了文件名,所以您可以打印它,让用户知道该文件已完成
编辑1:
另外一个问题是,是否可以标记页面边界。我想是的
一种肯定有效的方法是在OCR之前将PDF文件分成页。您可以使用poppler utils包中的pdfinfo来查找文档中的页数。然后,您可以使用同一poppler utils包中的pdfseparate将N页的一个pdf文件转换为一页的N个pdf文件。然后,您可以分别对单页PDF文件进行OCR。这将为您提供每一页上的文本
或者,您可以对整个文档进行OCR,然后搜索分页符。只有当文档的每页都有固定的或可预测的页眉或页脚时,这才有效。它可能不如上述方法可靠
编辑2:
如果需要文件,请写入文件:
从PyPDF2导入PdfileWriter、PdfileReader
导入文本摘要
def extract_文本(pdf_文件):
inputpdf=PdfileReader(打开(pdf文件,“rb”))
outfname=pdf_文件[:-4]+'.txt'#假设pdf文件名以“.pdf”结尾
以文本文件形式打开(outname,'w'):
对于范围内的i(inputpdf.numPages):
w=PdfileWriter()
w、 addPage(inputpdf.getPage(i))
outfname='page{:03d}.pdf'。格式(一)
使用open(outname,'wb')作为outfile:#我想您需要'wb'。
w、 写入(输出文件)
打印('第页',i)
text=textract.process(outname,method='tesseract')
#添加页眉和页脚。
text='\n<;开始页面位置={}>\格式(i)+文本+'\n<;结束页位置={}>\格式(一)
#将OCR文本写入输出文件。
textfile.write(文本)
os.移除(outname)#清理。
打印(文本)