首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PyMuPDF逐页逐行提取pdf中的文本

用PyMuPDF逐页逐行提取pdf中的文本
EN

Stack Overflow用户
提问于 2019-05-04 01:11:08
回答 2查看 3.2K关注 0票数 1

我必须从现有的PDF文档中提取文本。目前,我使用PyMuPDF模块来实现这一点。总体而言,它工作得很好,而且速度非常快。问题是,这个工具会用新的换行符替换pdf文档中的所有水平制表符(例如,在headings: 5 \t Topic中)。由于我必须逐行提取文本,这对我来说是非常不切实际的。

有没有人知道如何解决这个问题,或者知道另一种方法来逐页逐行提取文本页面?我还尝试了tika (这里我不能分页提取文本)和PyPDF2 (这太可怕了:对于任何格式化的文本(比如粗体),它会在提取的文本中换行。

代码语言:javascript
复制
for document in pdfPath:
    string_dic[document] = StringIO()
    pdf_file = fitz.open(document)
    number_of_pages = pdf_file.pageCount
    for page_number in range(number_of_pages):
        page = pdf_file.loadPage(page_number)
        page_content = page.getText("text")
        string_dic[document].write(page_content)
        string_dic[document].write(chr(12))
    string_dic[document].seek(0)

当我转换包含以下内容的PDF文档时:

5制表符后的\t文本

提取后得到如下结果:

5

制表符后的文本

EN

回答 2

Stack Overflow用户

发布于 2019-09-26 15:13:58

根据文档,

代码语言:javascript
复制
page.getText('text',flags=2) 

应该行得通。但是,当我尝试时,它仍然有\n而不是\t

另一种选择是将文本作为字典获取,并通过查找来构建文本。这是一种比较间接的方法,但是因为您获得了每个跨度的x0和x1位置,所以从技术上讲,您可以计算中间的空格并使用它们

代码语言:javascript
复制
page.getText('dict')

输出

代码语言:javascript
复制
{'width': 612.0,
 'height': 792.0,
 'blocks': [{'type': 0,
   'bbox': (72.28006744384766,
    72.37419891357422,
    156.7176055908203,
    87.02263641357422),
   'lines': [{'wmode': 0,
     'dir': (1.0, 0.0),
     'bbox': (72.28006744384766,
      72.37419891357422,
      78.36209869384766,
      87.02263641357422),
     'spans': [{'size': 12.0,
       'flags': 4,
       'font': 'Calibri',
       'color': 0,
       'text': '5',
       'bbox': (72.28006744384766,
        72.37419891357422,
        78.36209869384766,
        87.02263641357422)}]},
    {'wmode': 0,
     'dir': (1.0, 0.0),
     'bbox': (108.28006744384766,
      72.37419891357422,
      156.7176055908203,
      87.02263641357422),
     'spans': [{'size': 12.0,
       'flags': 4,
       'font': 'Calibri',
       'color': 0,
       'text': 'SomeText',
       'bbox': (108.28006744384766,
        72.37419891357422,
        156.7176055908203,
        87.02263641357422)}]}]}]}
票数 0
EN

Stack Overflow用户

发布于 2021-02-26 22:52:04

代码语言:javascript
复制
lis=[]
for i in doc[5].getText('dict')['blocks']:
    try:
    
    for l in range(len(i['lines'])):
        #print(len(i['lines']))
        #print(i['lines'][l]['spans'][0]['text'],i['lines'][l]['spans'][0]['font'],round(i['lines'][l]['spans'][0]['size']))
        li=list((i['lines'][l]['spans'][0]['text'],i['lines'][l]['spans'][0]['font'],round(i['lines'][l]['spans'][0]['size'])))
        #print(li)
        lis.append(li)
        #print(lis)
except KeyError:
    print(' ')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55974380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档