Python PdfMiner - 如何获取 pdf 中每个 word/sentence 的方向信息?
Python PdfMiner - How to get the info on the orientation of each word/sentence included in a pdf?
目标:
我想从附件中的 PDF 中提取有关每个单词或句子方向的信息。这样做的原因是我只想让文本保持零度方向,而不是 90,180 或 270 度。
我正在使用的文档是这个:text_with_orientation.pdf .
我试过的:
我尝试的第一件事是使用参数:PDFMiner 的 LAParams 的 detect_vertical 但这对我没有帮助。
当我尝试:“detect_vertical=True”时,我从所有方向获取所有文本,但 180 度的句子(实际上是倒置的)顺序错误:
*上边第三行
上侧,第二行
这是盒子的上侧。 *
当我尝试:“detect_vertical=False”时,我正在一个接一个地从侧面获取文本,但我仍然从 180 度(实际上是倒置的)获取文本再次以错误的顺序。旁边的文字是一个一个字符。
因为我只想过滤方向为 0 度的文本,上面的 none 对我没有帮助。
用于此的代码如下:
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')
目标: 我想从附件中的 PDF 中提取有关每个单词或句子方向的信息。这样做的原因是我只想让文本保持零度方向,而不是 90,180 或 270 度。
我正在使用的文档是这个:text_with_orientation.pdf .
我试过的: 我尝试的第一件事是使用参数:PDFMiner 的 LAParams 的 detect_vertical 但这对我没有帮助。
当我尝试:“detect_vertical=True”时,我从所有方向获取所有文本,但 180 度的句子(实际上是倒置的)顺序错误:
*上边第三行
上侧,第二行
这是盒子的上侧。 *
当我尝试:“detect_vertical=False”时,我正在一个接一个地从侧面获取文本,但我仍然从 180 度(实际上是倒置的)获取文本再次以错误的顺序。旁边的文字是一个一个字符。
因为我只想过滤方向为 0 度的文本,上面的 none 对我没有帮助。
用于此的代码如下:
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')