首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单词PDFMiner抽取-- LTText LTTextBox

单词PDFMiner抽取-- LTText LTTextBox
EN

Stack Overflow用户
提问于 2019-12-05 02:36:20
回答 2查看 1.8K关注 0票数 3

在下面的示例中,我使用PDFMiner生成单词x,y坐标,但是结果是逐行生成的。我如何将每个单词从另一个单词中拆分出来,而不是逐行拆分单词组(参见下面的示例)。我已经尝试了PDFMiner tutorial中的几个参数。LTTextBoxLTText都试过了。此外,我不能使用文本分析中通常使用的开始和结束偏移量。

这个PDF是一个很好的例子,在下面的代码中使用了它。

http://www.africau.edu/images/default/sample.pdf

代码语言:javascript
复制
from pdfminer.layout import LAParams, LTTextBox, LTText
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.converter import PDFPageAggregator

#Imports Searchable PDFs and prints x,y coordinates
fp = open('C:\sample.pdf', 'rb')
manager = PDFResourceManager()
laparams = LAParams()
dev = PDFPageAggregator(manager, laparams=laparams)
interpreter = PDFPageInterpreter(manager, dev)
pages = PDFPage.get_pages(fp)

for page in pages:
    print('--- Processing ---')
    interpreter.process_page(page)
    layout = dev.get_result()
    for lobj in layout:
        if isinstance(lobj, LTText):
            x, y, text = lobj.bbox[0], lobj.bbox[3], lobj.get_text()
            print('At %r is text: %s' % ((x, y), text))

这将返回可搜索PDF的x,y坐标,如下所示:

代码语言:javascript
复制
--- Processing ---
At (57.375, 747.903) is text: A Simple PDF File
At (69.25, 698.098) is text: This is a small demonstration .pdf file -
At (69.25, 674.194) is text: just for use in the Virtual Mechanics tutorials. More text. And more 
 text. And more text. And more text. And more text.

想要的结果(坐标是演示的代理):

代码语言:javascript
复制
--- Processing ---
At (57.375, 747.903) is text: A
At (69.25, 698.098) is text: Simple
At (69.25, 674.194) is text: PDF
At (69.25, 638.338) is text: File
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-17 05:21:51

使用PDFMiner,在遍历每一行之后(就像您已经做过的那样),您可以只遍历该行中的每个字符。

我使用下面的代码做到了这一点,同时尝试记录每个单词第一个字符的x,y,并设置一个条件以在每个LTAnno (例如\n )或.get_text() == ' '空格处拆分单词。

代码语言:javascript
复制
from pdfminer.layout import LAParams, LTTextBox, LTText, LTChar, LTAnno
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.converter import PDFPageAggregator

#Imports Searchable PDFs and prints x,y coordinates
fp = open('C:\sample.pdf', 'rb')
manager = PDFResourceManager()
laparams = LAParams()
dev = PDFPageAggregator(manager, laparams=laparams)
interpreter = PDFPageInterpreter(manager, dev)
pages = PDFPage.get_pages(fp)

for page in pages:
    print('--- Processing ---')
    interpreter.process_page(page)
    layout = dev.get_result()
    x, y, text = -1, -1, ''
    for textbox in layout:
        if isinstance(textbox, LTText):
          for line in textbox:
            for char in line:
              # If the char is a line-break or an empty space, the word is complete
              if isinstance(char, LTAnno) or char.get_text() == ' ':
                if x != -1:
                  print('At %r is text: %s' % ((x, y), text))
                x, y, text = -1, -1, ''     
              elif isinstance(char, LTChar):
                text += char.get_text()
                if x == -1:
                  x, y, = char.bbox[0], char.bbox[3]    
    # If the last symbol in the PDF was neither an empty space nor a LTAnno, print the word here
    if x != -1:
      print('At %r is text: %s' % ((x, y), text))

输出如下所示

代码语言:javascript
复制
At (64.881, 747.903) is text: A
At (90.396, 747.903) is text: Simple
At (180.414, 747.903) is text: PDF
At (241.92, 747.903) is text: File

也许您可以优化条件,以检测符合您的需求和喜好的词语。(例如,删除标点符号。!?在单词末尾)

票数 5
EN

Stack Overflow用户

发布于 2020-04-12 14:39:17

读者可能想要尝试的另一个包是pdfparser,它也是在Poppler上构建的(使用Cyton绑定),并且恰好在性能上进行了更优化

代码语言:javascript
复制
                           pdfreader      pdfminer  speed-up factor

tiny document (half page)    0.033s         0.121s     3.6 x
small document (5 pages)     0.141s         0.810s     5.7 x
medium document (55 pages)   1.166s        10.524s     9.0 x
large document (436 pages)  10.581s       108.095s    10.2 x

除了更快之外,它的错误处理也更好,并解决了Pdfminer卡顿的几个问题

代码语言:javascript
复制
import pdfparser.poppler as pdf
import sys

d=pdf.Document(sys.argv[1])

print('No of pages', d.no_of_pages)
for p in d:
    print('Page', p.page_no, 'size =', p.size)
    for f in p:
        print(' '*1,'Flow')
        for b in f:
            print(' '*2,'Block', 'bbox=', b.bbox.as_tuple())
            for l in b:
                print(' '*3, l.text.encode('UTF-8'), '(%0.2f, %0.2f, %0.2f, %0.2f)'% l.bbox.as_tuple())
                #assert l.char_fonts.comp_ratio < 1.0
                for i in range(len(l.text)):
                    print(l.text[i].encode('UTF-8'), '(%0.2f, %0.2f, %0.2f, %0.2f)'% l.char_bboxes[i].as_tuple(),\
                        l.char_fonts[i].name, l.char_fonts[i].size, l.char_fonts[i].color,)
                print()

正如你可以清楚地看到,源代码是最短的,但仍然提供了所有必要的数据,包括字体颜色,字体大小,字体系列。

更重要的是,您可以直接在区块中获取单词9(仅比字符高一级)。避免了空间检查逻辑,必须与Pdfminer一起使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59182694

复制
相关文章

相似问题

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