python – 如何使用OCR有效地从PDF文件目录中提取文本?

我有一个带有PDF文件(图像)的大目录,如何从目录中的所有文件中有效地提取文本?到目前为止,我试图:

import multiprocessing
import textract

def extract_txt(file_path):
    text = textract.process(file_path, method='tesseract')

p = multiprocessing.Pool(2)
file_path = ['/Users/user/Desktop/sample.pdf']
list(p.map(extract_txt, file_path))

但是,它不工作…需要很多时间(我有一些文档有600页).另外:a)我不知道如何有效地处理目录转换部分. b)我想添加一个页面分隔符,让我们说:< start / age = 1> …页面内容…< end / page = 1>,但是我不知道如何做到这一点.

因此,如何将extract_txt函数应用于以.pdf结尾的目录的所有元素,并在另一个目录中以.txt格式返回相同的文件,并添加带有OCR文本提取的页面分隔符.

此外,我是使用谷歌文档做这个任务的古董,是否可以通过编程方式使用谷歌文档来解决上述文本提取问题?

UPDATE

关于阅读罗兰·史密斯的答案后,“添加页面分隔符”问题(< start / age = 1> …页面内容…< end / page = 1>),我试图:

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('\n<begin page pos =' , i, '>\n')
        text = textract.process(str(outfname), method='tesseract')
        os.remove(outfname)  # clean up.
        print(str(text, 'utf8'))
        print('\n<end page pos =' , i, '>\n')

extract_text('/Users/user/Downloads/ImageOnly.pdf')

然而,我仍然有print()部分的问题,因为不是打印,将文件保存到所有输出将是更有用的.因此,我尝试将输出重定向到一个文件:

sys.stdout=open("test.txt","w")
print('\n<begin page pos =' , i, '>\n')
sys.stdout.close()
text = textract.process(str(outfname), method='tesseract')
os.remove(outfname)  # clean up.
sys.stdout=open("test.txt","w")
print(str(text, 'utf8'))
sys.stdout.close()
sys.stdout=open("test.txt","w")
print('\n<end page pos =' , i, '>\n')
sys.stdout.close()

任何想法如何使页面提取/分离器伎俩并将所有内容保存到文件中?

最佳答案
在你的代码中,你正在提取文本,但是你不会做任何事情.

尝试这样的东西:

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 = '<begin page pos = {}>\n'.format(i) + text + '\n<end page pos = {}>'.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)

转载注明原文:python – 如何使用OCR有效地从PDF文件目录中提取文本? - 代码日志