如何使用 Python 识别 PDF 文件中的删除文本

2024-03-30

我想从 .pdf 文件中仅提取删除线文本。我已经尝试过下面的代码,它正在使用我拥有的示例 pdf 文件。但它不适用于另一个我认为是扫描文件的 pdf 文件。 有没有任何标准方法可以使用 python 从 pdf 文件中仅提取删除文本? 任何帮助将非常感激。

这是我正在使用的代码:

from pydoc import doc
from pdf2docx import parse
from typing import Tuple
from docx import Document

def convert_pdf2docx(input_file: str, output_file: str, pages: Tuple = None):
    """Converts pdf to docx"""
    if pages:
        pages = [int(i) for i in list(pages) if i.isnumeric()]
    result = parse(pdf_file=input_file,
                   docx_with_path=output_file, pages=pages)
    summary = {
        "File": input_file, "Pages": str(pages), "Output File": output_file
    }

if __name__ == "__main__":
    pdf_file = 'D:/AWS practice/sample_striken_out.pdf'
    doc_file = 'D:/AWS practice/sample_striken_out.docx'
    convert_pdf2docx(pdf_file, doc_file)
    document = Document(doc_file)
    with open('D:/AWS practice/sample_striken_out.txt', 'w') as f:
        for p in document.paragraphs:
            for run in p.runs:
                if not run.font.strike:
                    f.write(run.text)
                    print(run.text)
            f.write('\n')

Note:我首先将 PDF 转换为 DOCX,然后尝试识别删除文本。此代码正在使用示例文件。但它不适用于扫描的 pdf 文件。 pdf 到 doc 的转换正在进行,但删除线检测没有进行。


Q.

另一个pdf文件,我认为是扫描的。有没有任何标准方法可以使用 python 从 pdf 文件中仅提取删除文本?

A.

您可以使用包括 Python 在内的任何语言,但由于与反编译非常复杂但愚蠢的编译页面语言文件相关的许多反转任务一样,它不是一项任务,而是许多通常基于单个字符。有关 PDF 提取的更好解决方案之一,请参阅使用 PDFBox 和 VB.NET 检测粗体、斜体和删除线文本 https://stackoverflow.com/questions/39962563/detect-bold-italic-and-strike-through-text-using-pdfbox-with-vb-net also Amazon Textract 识别 pdf 文件中的文本删除线 https://stackoverflow.com/questions/72452745/amazon-textract-to-identify-strike-through-text-from-pdf-file

一般来说,每种转换源和目标格式都有非常不同的方式来描述穿过文本放置的行。让我们看一下其中的一些。因此,PDF 中的删除线与文本无关,它可以有多种形式,具体取决于印刷作者。这里只是在纯文本之后添加了一个。

23 0 obj
<<
  /Type /Annot
  /Subtype /StrikeOut
  /C [ 1 0 0 ]
  /P 3 0 R
  /F 4
  /M (D:20220614085648Z)
  /T (K)
  /Rect [ 26.577025 361.84715 70.29766 393.2207 ]
  /AP <<
    /N 24 0 R
  >>
  /QuadPoints [ 28.32 391.47773 68.55469 391.47773 28.32 363.59013
      68.55469 363.59013 ]
  /Contents (AEI)
>>
endobj

24 0 obj
<<
  /Type /XObject
  /Subtype /Form
  /BBox [ 26.577025 361.84715 70.29766 393.2207 ]
  /Matrix [ 1 0 0 1 0 0 ]
  /Length 62
>>
stream
1 0 0 RG
1.7429752 w
28.32 375.54197 m
68.55469 375.54197 l
S

endstream
endobj

所以虽然在这种情况下它确认线路已经结束Contents (AEI)通常情况并非如此,因为它只是独立于文本的一行。唯一的联系是页面上某处定义为矩形的位置。因此,上面的 PDF 是此屏幕截图中左侧的红线,但是黑红蓝绿线与源 txt 文件生成的删除线不同,它们除了位置之外还通过颜色绑定(请注意,文本的间距与这些线但它们似乎是一条连续的线)。

在 docX 中常见文本(例如带下划线的 IOX)以不同方式“内嵌”分组。

<w:r>
<w:rPr>
<w:rFonts w:ascii="Verdana" w:hAnsi="Verdana" w:cs="Verdana" w:eastAsia="Verdana"/>
<w:strike w:val="true"/>
<w:color w:val="auto"/>
<w:spacing w:val="0"/>
<w:position w:val="0"/>
<w:sz w:val="50"/>
<w:u w:val="single"/>
<w:shd w:fill="auto" w:val="clear"/>
</w:rPr>
<w:t xml:space="preserve">I0X</w:t>
</w:r>

因此,单色文本首先按浮在其下的行进行分组,然后再分组为“stricken”。

由于这个原因和许多原因,程序不容易检测如何处理此类情况,每个库都会根据不同的输入采取不同的做法。然而,他们普遍同意的一件事是,基本的 PDF 转换器不太可能将一行像素中的像素转换为 OCR 删除线。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python 识别 PDF 文件中的删除文本 的相关文章

  • Python 3 os.urandom

    在哪里可以找到完整的教程或文档os urandom 我需要获得一个随机 int 来从 80 个字符的字符串中选择一个字符 如果你只需要一个随机整数 你可以使用random randint a b 来自随机模块 http docs pytho
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 如何使用 Ghostscript DLL 将 PDF 转换为 PDF/A

    如何使用 GhostScript DLL 将 PDF 转换为 PDF A 我知道我必须调用 gsdll32 dll 的导出函数 其名称为 gsapi init with args 但如何传递正确的参数 顺便说一句 我正在使用 C 请尝试从命
  • 用缺失的日期填充其他列 Nan Pandas DataFrame

    我实际上是从几个 Excel 文件中提取数据来监控我的每日卡路里摄入量 我设法使用列表理解来生成日期 我尝试使用合并或连接 但它不起作用 ValueError 您正在尝试合并对象和 float64 列 date list 2021 05 2
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • Django send_mail SMTPSenderRefused 530 与 gmail

    一段时间以来 我一直在尝试使用 Django 从我正在开发的网站接收电子邮件 现在 我还没有部署它 并且我正在使用Django开发服务器 我不知道这是否会影响它 这是我的 settings py 配置 EMAIL BACKEND djang
  • pytest:同一接口的不同实现的可重用测试

    想象一下我已经实现了一个名为的实用程序 可能是一个类 Bar在一个模块中foo 并为其编写了以下测试 测试 foo py from foo import Bar as Implementation from pytest import ma
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • 使用 Pandas 计算 delta 列

    我有一个数据框 如下所示 Name Variable Field A 2 3 412 A 2 9 861 A 3 5 1703 B 3 5 1731 A 4 0 2609 B 4 0 2539 A 4 6 2821 B 4 6 2779 A
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • Elasticsearch 通过搜索返回拼音标记

    我用语音分析插件 https www elastic co guide en elasticsearch plugins current analysis phonetic html由于语音转换 从弹性搜索中进行一些字符串匹配 我的问题是
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • 双击打开 ipython 笔记本

    相关文章 通过双击 osx 打开 ipython 笔记本 https stackoverflow com questions 16158893 open an ipython notebook via double click on osx

随机推荐