我有一堆正确显示西里尔字母的pdfs。但是如果我复制并粘贴他们的文字,就会产生胡言乱语。
然后,我使用保存函数从okular将pdf转换为文本文件,并发现编码是WINDOWS-1251,这是一个古老的西里尔编码。转换后,它UTF-8,西里尔的显示正确。
文件的一个示例链接是https://cdn.esis.edu.mn/cover/01/01_mongol_khel.pdf。
有没有办法将pdfs转换成编码的UTF-8,以便我可以复制、粘贴和搜索?
解决了
使用@iPDFdev提供的信息,我设法解决了这个问题。
对于可能遇到类似问题的人,我将Windows1251放在https://www.compart.com/en/unicode/charsets/windows-1251的UTF-8表中,并在https://github.com/pymupdf/PyMuPDF/issues/530上修改了代码。我完全无视旧的Unicode地图,并在所有页面上添加了用于所有字体的西里尔字母地图。
代码语言:javascript运行复制import fitz
import re
doc = fitz.open(inputFileName)
new = '1 beginbfrange\n
for pno in range(doc.page_count):
font_tuples = doc.get_page_fonts(2)
for font_tuple in font_tuples:
for line in doc.xref_object(font_tuple[0]).splitlines():
line = line.strip()
if line.startswith("/ToUnicode"):
stream_id = int(line.split()[1])
old_stream_decoded = doc.xref_stream(stream_id).decode()
new_stream_decoded = re.sub('[0-9]+? beginbfrange.*endbfrange', new, old_stream_decoded, flags=re.DOTALL)
new_stream_encoded = new_stream_decoded.encode()
doc.update_stream(stream_id, new_stream_encoded)
doc.save(outputFileName)