问题描述
目标: 我想从PDF中提取有关每个单词或句子方向的信息,就像所附的那样。这样做的原因是,我只想从零度方向而不是90,180或270度的方向保留文本。
我正在使用的文档是这样的:text_with_orientation.pdf。
我尝试过的事情: 我尝试的第一件事是使用参数: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:','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:','and y dim:',y)
print('\n')