• Как достать кириллицу из RTF файла через python или linux?

    @dec0der-dc
    Я очень долго гуглил этот вопрос. И ничего не помогало.
    Суть в том, что напрямую RTF в текст на Linux в python'е перевести нельзя.
    Точнее можно, если он содержит только английский текст.
    А вот с русским большие проблемы. Но есть лайф-хак.
    Как я уже сказал, если попробовать

    import textract
    import pypandoc
    
    pathname = '<path to file>'
    text1 = textract.process(pathname).decode('utf-8')
    text2 = pypandoc.convert_file(pathname, 'plain')


    то text 1 будет содержать некоторую служебную информацию из файла,
    а text2 -- различные вариации кривых символов вместо нужных.

    С pandoc всё глухо -- он вещь в себе.
    А вот textract работает через unrtf, который в последних версиях (я пробовал на 0.21.10) умеет в кириллицу. Но с оговорками: если попробовать конвертировать сразу в текст, вы получите пустоту. Нужно сначала конвертировать в html:

    import pypandoc
    import textract
    import os
    
    pathname = '<path to file>'
    os.system(f'unrtf --html {pathname} > {pathname}.html')
    pathname += '.html'
    text1 = text = textract.process(pathname).decode('utf-8')
    text2 = pypandoc.convert_file(pathname, 'plain')


    Вот теперь всё правильно. Одно плохо: нельзя всё сделать, оставаясь только в python'е.
    Приходится вызывать shell. Но зато в текущей рабочей директории будут появляться вложенные картинки в формате имён pict[NNN].[ext]. Дело в том, что unrtf выводит текст или html в стандартный вывод, а файлы, соответственно в текущую директорию.
    Параметра с выводом файла у него нет.

    Главной загадкой в этом вопросе для меня остаётся, почему
    unrtf --html file.rtf > file.html
    получает текст, а
    unrtf --text file.rtf > file.txt
    нет.

    Но решение всё равно остаётся кросс-платформенным и компактным (чего не скажешь о варианте с lowriter из Libre Office), так как в pip есть и textract и unrtf (для установки которого на windows вам потребуется 2015 студия на win7, либо свежая на win10...).
    Ответ написан
    Комментировать