试图将印地语PDF转换为CSV时的编码问题
我现在正在尝试用Python中的fitz库把一个包含印地语天城文的PDF文件转换成CSV文件,但在读取文本时遇到了奇怪的编码问题。
这是PDF中的一页:
我使用以下代码来读取文本:
import fitz
from indic_transliteration import sanscript
from indic_transliteration.sanscript import transliterate
def extract_text_from_pdf(pdf_file):
text = ""
with fitz.open(pdf_file) as pdf_document:
for page_num in range(len(pdf_document)):
page = pdf_document.load_page(page_num)
text += page.get_text()
return text
def devanagari_to_roman(text):
return transliterate(text, sanscript.DEVANAGARI, sanscript.ITRANS)
def main():
pdf_file = 'data/agra_2010.pdf'
extracted_text = extract_text_from_pdf(pdf_file)
roman_text = devanagari_to_roman(extracted_text)
print(roman_text)
if __name__ == "__main__":
main()
但是这是印地语文本在输出中显示的样子:
òû£û™û
òû£û™û
òû£û™û
òû£û™û
ftys dk uke&
ftys dk dksM &
我在使用tabula函数read_pdf时也遇到了同样的问题,所以这不仅仅是我使用的库的问题。我希望在输出中保留印地语脚本。如果你有任何解决方案,请告诉我。谢谢!
1 个回答
0
你没有提供那个损坏的文件,但在网上找到类似的问题并不难。
这是一个常见的问题,使用了不标准的字体,导致表面上的数字和墨水不匹配。我选择了“fuok”这一部分。我们可以看到,左上角的德瓦纳加里字母是以f
的形式存储的。第二行的第二个字符是二进制的u
,以及它的德瓦纳加里字母的样子等等。
好消息是,拉丁字体嵌入得很正确。而且这应该是比较容易修复的问题,因为似乎没有重复的字符。
坏消息是,这个过程非常慢,需要手动核对两个完整字母表的映射,最后可能还是会得到一些垃圾结果。
我们先来看f
的键码 = "U+093F: 德瓦纳加里元音符号 I"
ि
,所以我们需要重新映射这个键,然后是 VA NA(我可能搞错了?)。
当然,有些字符看起来会更好,但以这种方式替换字符通常会变得更糟。
所以,除非你想重新输入所有内容,否则就别指望在PDF里简单地查找和替换。由于双向覆盖,所有字母的位置都会被破坏,而且没有额外的字距调整。请原谅我在这里没有正确匹配几个字符(在右侧的纯文本中),我们可以看到印地语字符不会像预期那样重叠。
使用纯文本通过查找和替换的方式,采用类似但可以编程的二进制方式在文字处理软件中使用德瓦纳加里会更简单。
所以导入到MS Word中,使用印地语风格的查找和替换会更好。因此,需要一个VBA编程解决方案。