如何使用Python中的坐标从PDF中提取文本片段?

2024-04-25 19:03:00 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个数字创建的PDF文件,我想用坐标提取文本。边界框会很棒,但锚定+字体/字体大小也可以

我创建了一个example PDF document,这样就可以很容易地进行尝试/共享结果

我试过的

pdftotext

pdftotext PDF-export-example.pdf -layout

给出this output。它已经包含文本,但坐标不在其中

PyPDF2

PyPDF2甚至更糟-也没有坐标,也没有字体大小,在本例中甚至没有ASCII艺术提示布局是如何的:

from PyPDF2 import PdfFileReader


def text_extractor(path):
    with open(path, "rb") as f:
        pdf = PdfFileReader(f)
        page = pdf.getPage(0)
        text = page.extractText()
        print(text)


if __name__ == "__main__":
    path = "PDF-export-example.pdf"
    text_extractor(path)

pdfminer.six

另一种提取文本的方法,但没有坐标/字体大小。 感谢Duck puncher为这一个:

from io import StringIO

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager
from pdfminer.pdfpage import PDFPage


def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = "utf-8"
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, "rb")
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()

    for page in PDFPage.get_pages(
        fp,
        pagenos,
        maxpages=maxpages,
        password=password,
        caching=caching,
        check_extractable=True,
    ):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text


if __name__ == "__main__":
    print(convert_pdf_to_txt("PDF-export-example.pdf"))

这一个朝着正确的方向走了一点,因为它可以给出字体名称和大小。但是仍然缺少坐标(输出有点冗长,因为它是逐字符的):

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer, LTChar

for page_layout in extract_pages("PDF-export-example.pdf"):
    for element in page_layout:
        if isinstance(element, LTTextContainer):
            for text_line in element:
                for character in text_line:
                    if isinstance(character, LTChar):
                        print(character)
                        print(character.fontname)
                        print(character.size)

表Y

在这里,我什么也得不到:

from tabula import read_pdf

df = read_pdf("PDF-export-example.pdf")
print(df)

Tags: pathtextinfromimportforpdfexample
2条回答

我使用PyMuPDF将页面内容提取为包含bbox信息的单个单词列表

import fitz

doc = fitz.open("PDF-export-example.pdf")

for page in doc:
    wlist = page.getTextWords()  # make the word list
    print(wlist)

输出

[
    (72.0250015258789, 72.119873046875, 114.96617889404297, 106.299560546875, 'Test', 0, 0, 0),
    (120.26901245117188, 72.119873046875, 231.72618103027344, 106.299560546875, 'document', 0, 0, 1),
    (72.0250015258789, 106.21942138671875, 101.52294921875, 120.18524169921875, 'Lorem', 1, 0, 0),
    (103.98699951171875, 106.21942138671875, 132.00445556640625, 120.18524169921875, 'ipsum', 1, 0, 1),
    (134.45799255371094, 106.21942138671875, 159.06637573242188, 120.18524169921875, 'dolor', 1, 0, 2),
    (161.40098571777344, 106.21942138671875, 171.95208740234375, 120.18524169921875, 'sit', 1, 0, 3),
    ...
]

page.getTextWords()

  • 方法使用空格和线条将页面文本分隔为“单词” 分隔符。因此,此列表中的单词不包含 空格或换行符

  • 返回类型:list

此列表中的一项如下所示:

(x0, y0, x1, y1, "word", block_no, line_no, word_no)

其中前4项是单词的bbox的浮点坐标。最后三个整数提供了有关单词下落的更多信息。


关于菲茨名字的注释 PyMuPDF库的标准Python导入语句是import fitz。这有一个历史原因:

MuPDF的原始渲染库称为Libart

在Artifex软件获得MuPDF项目后,开发重点转移到编写一个名为Fitz的新的现代图形库。Fitz最初的目的是作为一家研发中心;D项目取代老化的Ghostscript图形库,但已成为驱动MuPDF的渲染引擎

您可以使用^{} option解析poppler的pdftotext的输出:

import subprocess
from lxml import etree

file = 'PDF-export-example.pdf'
xml = etree.fromstring(subprocess.check_output(['pdftotext', '-bbox', file , '-']))
for pn, page in enumerate(xml.findall('.//{http://www.w3.org/1999/xhtml}page')):
    for word in page.findall('{http://www.w3.org/1999/xhtml}word'):
        print(pn, word.get('xMin'), word.get('yMin'),
            word.get('xMax'), word.get('yMax'), word.text)

输出:

0 72.025000 72.124000 114.977000 105.780000 Test
0 120.269000 72.124000 231.737000 105.780000 document
0 72.025000 106.220500 101.519500 119.755000 Lorem
0 103.987000 106.220500 132.001000 119.755000 ipsum
0 134.458000 106.220500 159.070000 119.755000 dolor
...

相关问题 更多 >