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

如何使用Python中的坐标从PDF中提取文本片段?,python,pdf,Python,Pdf,给定一个数字创建的PDF文件,我想用坐标提取文本。边界框会很棒,但锚定+字体/字体大小也可以 我已经创建了一个,这样就可以很容易地进行尝试/分享结果 我试过的 pdftotext 给。它已经包含文本,但坐标不在其中 PyPDF2 PyPDF2甚至更糟-也没有坐标,也没有字体大小,在本例中甚至没有ASCII艺术提示布局是如何的: 从PyPDF2导入PdfileReader def文本_提取器(路径): 打开(路径“rb”)作为f: pdf=PdfileReader(f) page=pdf.getP

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

我已经创建了一个,这样就可以很容易地进行尝试/分享结果

我试过的 pdftotext 给。它已经包含文本,但坐标不在其中

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

从PyPDF2导入PdfileReader
def文本_提取器(路径):
打开(路径“rb”)作为f:
pdf=PdfileReader(f)
page=pdf.getPage(0)
text=page.extractText()
打印(文本)
如果名称=“\uuuuu main\uuuuuuuu”:
path=“PDF导出示例.PDF”
文本提取程序(路径)
pdfminer.6 另一种提取文本的方法,但没有坐标/字体大小。 感谢您为这一点:

从io导入StringIO
从pdfminer.converter导入文本转换器
从pdfminer.layout导入LAParams
从pdfminer.pdfinterp导入pdfpageexplorer、PDFResourceManager
从pdfminer.pdfpage导入pdfpage
def将pdf文件转换为txt文件(路径):
rsrcmgr=PDFResourceManager()
retstr=StringIO()
codec=“utf-8”
laparams=laparams()
device=TextConverter(rsrcmgr、retstr、codec=codec、laparams=laparams)
fp=开放(路径“rb”)
解释器=PDFPAGE解释器(rsrcmgr,设备)
password=“”
maxpages=0
缓存=真
pagenos=set()
对于PDFPage.get_页面中的页面(
外交政策,
佩格诺斯,
maxpages=maxpages,
密码=密码,
缓存=缓存,
检查_extractable=True,
):
解释器。处理页面(第页)
text=retstr.getvalue()
fp.close()
设备关闭()
retstr.close()
返回文本
如果名称=“\uuuuu main\uuuuuuuu”:
打印(将pdf转换为txt(“pdf导出示例.pdf”))
这一个朝着正确的方向走了一点,因为它可以给出字体名称和大小。但是仍然缺少坐标(输出有点冗长,因为它是逐字符的):

来自pdfminer.high_级别导入提取页面
从pdfminer.layout导入LTTextContainer,LTChar
对于摘录页面中的页面布局(“PDF export example.PDF”):
对于页面布局中的元素:
如果isinstance(元素,LTTextContainer):
对于元素中的文本行:
对于文本行中的字符:
如果isinstance(字符,LTChar):
打印(字符)
打印(字符.字体名称)
打印(字符大小)
表格 在这里,我什么也得不到:

从表格导入读取\u pdf
df=读取pdf(“pdf导出示例.pdf”)
打印(df)
我曾经将页面内容提取为包含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),
    ...
]
其中前4项是单词的浮动坐标。最后三个整数提供了有关单词下落的更多信息。


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

MuPDF的原始渲染库称为Libart


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

您可以使用以下命令解析poppler的
pdftotext
输出:

输出:

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
...

哇,这太棒了!你知道是否有可能得到字体/字号吗?这可能有助于回答这个问题。你能告诉我这些坐标值到底是什么吗?我是说这些是像素值,还是其他尺度?我看到它们是浮点数,所以我不认为它是像素值。我想在PDF上以图像的形式显示它。将OpenCV用于that@RishabhGupta看看这个。
(x0, y0, x1, y1, "word", block_no, line_no, word_no)
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
...