Python PdfMiner - 如何获取 pdf 中包含的每个单词/句子的方向信息?

标签 python text-parsing text-extraction pdfminer pdf-scraping

目标: 我想从 PDF(如附件)中提取每个单词或句子的方向信息。这样做的原因是我只想保留文本的方向为 0 度,而不是 90,180 或 270 度。

.

我尝试过的: 我尝试的第一件事是使用PDFMiner的LAParams的参数:Detect_vertical,但这对我没有帮助。

当我尝试:“detect_vertical=True”时,我会从所有方向获取所有文本,但 180 度的句子(实际上是倒置的)顺序错误:

*上侧,第三行
上侧,第二行
这是盒子的上侧。 *

当我尝试:“detect_vertical=False”时,我会从侧面一一获取文本,但我仍然从 180 度(实际上是反转的)获取文本,顺序又错误。侧面的文字是一字一字的。

由于我只想过滤方向为 0 度的文本,因此以上方法都对我没有帮助。

用于此目的的代码如下:

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

page_info = list(extract_pages('pdfminer/text_with_orientation.pdf' ,
                               laparams= LAParams(detect_vertical=True ) ) ) 
 
for page in page_info:
    for element in page:
        if isinstance(element, LTTextContainer): 
            print(element.get_text()) 

我尝试的第二件事是从 PDF 布局 (LTChar) 的最新级别获取此信息,如下所述:https://pdfminersix.readthedocs.io/en/latest/topic/converting_pdf_to_text.html#working-with-rotated-characters

我在这次尝试中使用的代码如下,但不幸的是我只能得到:字体名称、字体大小和字符的坐标,而不是方向:

from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer, LAParams , LTChar
 
page_info = list(extract_pages('pdfminer/text_with_orientation.pdf' ,
                               laparams= LAParams(detect_vertical=True ) ) ) 
for page in page_info:
    for element in page:
        if isinstance(element, LTTextContainer):
            for text_line in element:
                for character in text_line:
                    if isinstance(character, LTChar):
                        print('======================')
                        print('text:',character.get_text()) 
                        print('fontname:',character.fontname[7:])
                        print('size:',character.size)   
                        print('adv:',character.adv)   # textwidth * fontsize * scaling  
                        print('matrix:',character.matrix)  
                        (_,_,x,y) = character.bbox 
                        print('x dim:',x,'and y dim:',y) 
                        print('\n') 

我不想使用的:

我不想使用 Tesseract,因为我已经尝试过了,结果不如使用 PDFMiner

对此有什么建议吗?

最佳答案

经过大量调查,我终于找到了一种通过使用 LTChar 中包含的矩阵在字符级别执行此操作的方法。

因此,为了获得所有 0 度的字符,我执行以下操作:

for page in label_pages:
    for element in page:
        if isinstance(element, LTTextContainer):
            for text_line in element:
                for character in text_line:
                    if isinstance(character, LTChar):
                        if character.matrix[0]>0 :
                            print('======================')
                            print('text:',character.get_text())    
                            print('matrix:',character.matrix)     
                            (_,_,x,y) = character.bbox 
                            print('x dim:',x,'and y dim:',y) 
                            print('\n') 

关于Python PdfMiner - 如何获取 pdf 中包含的每个单词/句子的方向信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64043955/

相关文章:

python - 无法访问类属性

r - 如何在 R 中读取文本文件并创建数据框

php - 用于 php 的 html 文本提取

python - 如何从这个压缩的 PDF/A 中提取文本?

python - 缩放 Tkinter 小部件

python - 在网站上运行搜索并返回结果的脚本

python - 为什么python输出负十六进制?

java - 使用正则表达式解析数组语法

python - asn1 将文本解析为 json

regex - 从句子中提取数字