如何解码LTTextLine.get_text()的输出?

时间:2019-01-31 15:27:26

标签: python pdfminer

我是PDFminer的新手。我注意到使用PDFminer get_text()命令时,某些符号/标点符号未以文字形式输出。例如,“-”表示为“ \ xe2 \ x80 \ x93”,单引号'表示为“ \ xe2 \ x80 \ x99”。这是我使用的命令:

print(LTTextLine.get_text()。encode('UTF-8'))

有人可以帮助我理解如何阅读这些内容,并将其转换回原义吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您不喜欢的十六进制转义符不是连字符(ASCII 39)和单引号(ASCII 45)。他们是印刷连字符(又名EN-破折号)(统一2010)和右单(“智能”)引号(统一2019)。它们被编码为UTF-8。如果你想将它们解码,处理包含它们的字符串作为字节,而不是字符串(注意b前缀):

>>> mystring = b"This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> mystring.decode('UTF8')
'This is an en–dash and this - isn’t'

如果Python中认为该数据已经是一个字符串,如下面,没有b前缀,那么你需要说服它,它真是个字节,结果解码:

>>> mystring = "This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> bytes(mystring.encode("latin-1")).decode("UTF-8")
'This is an en–dash and this - isn’t'

在字体,SO使用没有ASCII 39和2010之间的Unicode多明显不同但在一般的印刷连字符较短,更厚和更接近基线比ASCII连字符。其他两个之间的区别是相当明确的 isn’t'。这是常见的,找到的Unicode在.pdf文件变种,因为他们要印刷。该ASCII变体,才适合在程序代码中,老打字机的仿真;而不是印刷书籍和杂志。