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 删除线。