使用 Python 抓取 PDF 文本 (pdfquery)

2023-12-24

我需要抓取一些 PDF 文件来提取以下文本信息:

我尝试使用 pdfquery 来完成此操作,方法是解决我在 Reddit 上找到的示例(请参阅第一篇文章):https://www.reddit.com/r/Python/comments/4bnjha/scraping_pdf_files_with_python/ https://www.reddit.com/r/Python/comments/4bnjha/scraping_pdf_files_with_python/

我想通过首先获取许可证号来测试它。我进入生成的“xmltree”文件,找到第一个许可证号并在 LTTextLineHorizo​​ntal 元素中获取 x0,y0,x1,y1 坐标。

import pdfquery
from lxml import etree


PDF_FILE = 'C:\\TEMP\\ad-4070-20-september-2018.pdf'

pdf = pdfquery.PDFQuery(PDF_FILE)
pdf.load(4,5)

with open('xmltree.xml','wb') as f:
    f.write(etree.tostring(pdf.tree, pretty_print=True))

product_info = []
page_count = len(pdf._pages)
for pg in range(page_count):
    data = pdf.extract([
        ('with_parent', 'LTPage[pageid="{}"]'.format(pg+1)),
        ('with_formatter', None),
        ('product_name', 'LTTextLineHorizontal:in_bbox("89.904, 757.502, 265.7, 770.83")'),
        ('product_details', 'LTTextLineHorizontal:in_bbox("223, 100, 737, 1114")'),
    ])
    for ix, pn in enumerate(sorted([d for d in data['product_name'] if d.text.strip()], key=lambda x: x.get('y0'), reverse=True)):
        product_info.append({'Manufacturer': pn.text.strip(), 'page': pg, 'y_start': float(pn.get('y1')), 'y_end': float(pn.get('y1'))-150})
        # if this is not the first product on the page, update the previous product's y_end with a
        # value slightly greater than this product's y coordinate start
        if ix > 0:
            product_info[-2]['y_end'] = float(pn.get('y0'))
    # for every product found on this page, find the detail information that falls between the
    # y coordinates belonging to the product
    for product in [p for p in product_info if p['page'] == pg]:
        details = []
        for d in sorted([d for d in data['product_details'] if d.text.strip()], key=lambda x: x.get('y0'), reverse=True):
            if  product['y_start'] > float(d.get('y0')) > product['y_end']:
                details.append(d.text.strip())
        product['Details'] = ' '.join(details)
pdf.file.close()

for p in product_info:
    print('Manufacturer: {}\r\nDetail Info:{}...\r\n\r\n'.format(p['Manufacturer'], p['Details'][0:100]))

但是,当我运行它时,它不会打印任何内容。没有错误,XML 文件生成得很好,而且我直接从 XML 文件获取坐标,所以应该没有问题。我究竟做错了什么?


对于从 PDF 文件中提取文本,我最喜欢的工具是pdftotext.

使用-layout选项,你基本上会得到一个纯文本,使用 Python 相对容易操作。

下面的例子:

"""Extract text from PDF files.

Requires pdftotext from the poppler utilities.
On unix/linux install them using your favorite package manager.

Binaries for ms-windows can be found at;
1) VERY OLD 32 bit http://blog.alivate.com.au/poppler-windows/  
   RECENT 64 bit https://github.com/oschwartz10612/poppler-windows
2) https://sourceforge.net/projects/poppler-win32/
"""

import subprocess


def pdftotext(pdf, page=None):
    """Retrieve all text from a PDF file.

    Arguments:
        pdf Path of the file to read.
        page: Number of the page to read. If None, read all the pages.

    Returns:
        A list of lines of text.
    """
    if page is None:
        args = ['pdftotext', '-layout', '-q', pdf, '-']
    else:
        args = ['pdftotext', '-f', str(page), '-l', str(page), '-layout',
                '-q', pdf, '-']
    try:
        txt = subprocess.check_output(args, universal_newlines=True)
        lines = txt.splitlines()
    except subprocess.CalledProcessError:
        lines = []
    return lines
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 抓取 PDF 文本 (pdfquery) 的相关文章

随机推荐

  • 此场景的 GUID/UUID?还是复合键?或其他

    我目前正在开发一个系统 在某些情况下 该系统需要白天在本地数据库上运行 然后在晚上复制到中央服务器 它cannot所有这些都从一个中央数据库运行 因为本地站点会定期与该数据库失去联系 中央服务器上的数据用于仅查看和报告在总部 因此不需要将任
  • 未定义的方法“link_to”

    我正在编写一个 ruby on rails 库模块 module Facets class Facet attr accessor name display name category group special URI controlle
  • iOS 7 中文本字段的弹出/模式选择器

    我在弄清楚如何实现标准弹出选择器时遇到了很多麻烦 就像许多应用程序的注册屏幕一样 当用户选择生日文本字段时 我希望出现一个弹出选择器 以便用户可以选择他们的生日 单击完成 格式化日期将添加到文本字段 这似乎并不那么困难 但在 iOS 7 中
  • 如何使用新的 Google Analytics 在 PHP 中获取当前访问者的引荐来源网址、付费/自然和关键字?

    我想了解访问者如何访问我的网站的信息 在 Google Analytics 的早期版本中 您可以使用他们的 cookie 参见例如使用 Google Analytics 获取当前访问者的引荐来源网址 付费 自然和关键字 https stac
  • 提交后的 mvc3 复选框值

    我有一个包含 2 个字段的表单 一个下拉列表和一个复选框 我一切正常 但由于某种原因 如果选中这是我的代码 我无法获取复选框的值 HttpPost public ActionResult view string pick switch pi
  • 切换 UITextView 中的 selectedRange 属性

    我创建了一个按钮 我想检查是否选择了文本 然后在点击时在 selectedRange 上切换粗体和非粗体 目前 我的代码只会将 selectedRange 更改为粗体 我无法撤消它或检查是否有选择 我怎样才能实现这个目标 func bold
  • Meteor.js - 在多个集合上进行用户搜索的方法

    关于如何在 Meteor 应用程序中设置集合 我遇到了一些困境 用户搜索栏是我的应用程序的核心部分 用户需要能够输入一个搜索并在多个不同的集合中获得结果 user query foo var query foo var actors res
  • 经典的asp存储过程参数

    我一直在研究如何从经典 asp 调用存储过程并将参数传递给它 下面是我的存储过程 它工作得很好 CREATE PROCEDURE Paging Movies alphaChar char 1 AS if alphaChar select f
  • 为什么从 python 调用 ffmpeg 会阻塞?

    我尝试了 3 种方法从 python 调用 ffmpeg 但它总是阻塞并且不返回任何结果 但是 如果我从 shell 执行它 它就会起作用 For eg usr bin ffmpeg y i tmp uploadedfiles movie8
  • 在 R 中对“年/月”列进行排序

    我试图在 R 中按 year month 列对数据框进行排序 但停留在 as Date 函数上 我尝试了其他几种方法但没有成功 我可以寻求帮助吗 这里是 我的代码是 temp2 sort lt temp2 with temp2 order
  • R:将查找表与数据框合并

    我正在使用 R 编程语言 我有以下有关患者医疗特征和疾病患病率的数据集 set seed 123 library dplyr Patient ID 1 5000 gender lt c Male Female gender lt sampl
  • WordPress 在不使用 get_posts() 的情况下获取帖子数量?

    需要一个专门设计用于获取匹配条件的帖子计数的函数调用 我认为 get posts 函数对于此操作来说太昂贵了 我只是想决定当有预定义数量的帖子要显示时是否显示 查看更多帖子 链接 例如 要显示的默认帖子链接数为 3 我只想在帖子总数超过 3
  • SPARK SQL - 使用 DataFrames 和 JDBC 更新 MySql 表

    我正在尝试使用 Spark SQL DataFrames 和 JDBC 连接在 MySql 上插入和更新一些数据 我已成功使用 SaveMode Append 插入新数据 有没有办法从 Spark SQL 更新 MySql 表中已有的数据
  • Javascript:将逗号替换为### - 仅用双引号[重复]

    这个问题在这里已经有答案了 在下面的字符串中 This is just for Test ignore it My name is FirstName LastName 我想将双引号 内的所有逗号 替换为 目前我只找到了 的匹配模式 但需要
  • jQuery + JSON 如何从变量定义键

    我有以下代码 post factory set key value function response json where key foo value bar 但服务器总是获取 key 和 bar 有没有办法将键设置为变量 而不是字符串
  • ASP.Net MVC 和 Comet (WebSync)

    我正在尝试在我的 ASP Net MVC 2 0 项目中实现 comet 我在用着WebSync http www frozenmountain com websync 来自冰冻山 我的网站是用 C 4 0 和 ASP Net 4 0 编码
  • 直接从 Eclipse 本地历史记录恢复已删除的文件

    发生了一些 git 错误 我丢失了一个文件的很多更改 我使用 Eclipse 作为 IDE 但 git 错误包括删除项目并重新克隆目录 所以我无法从 Eclipse 中进行恢复 我相信我已经找到了包含我想要恢复的代码的本地历史文件 但我不确
  • 我可以在 Windows Azure 中托管应用程序并将数据库存储在不同的服务器上吗

    我可以在 Windows Azure 中托管应用程序并将数据库存储在不同的服务器上吗 例如 我想将我的数据保存在服务器上 这样我就不必担心隐私问题 如果这是可能的 是否会消除在云中托管应用程序的价值 thanks 您的意思是在 Window
  • 您如何知道 Pytorch Save 是否包含模型和/或仅包含权重?

    我对 pytorch 相当陌生 这可能是版本问题 但我看到使用了 torch load 和 torch load state dict 但在这两种情况下 文件扩展名通常是 pth 我创建的模型 我可以通过 torch Save 和 torc
  • 使用 Python 抓取 PDF 文本 (pdfquery)

    我需要抓取一些 PDF 文件来提取以下文本信息 我尝试使用 pdfquery 来完成此操作 方法是解决我在 Reddit 上找到的示例 请参阅第一篇文章 https www reddit com r Python comments 4bnj