@AlexMine
Учусь

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

Добрый вечер, пытаюсь вытащить русский текст из rtf файла, пытаюсь выполнить из консоли утилиту unrtf
def rtf_file_to_text(path: str) -> str:
    """
        Возвращает текст из rtf документа
    """

    cmd = ['unrtf', path]
    p = Popen(cmd, stdout=PIPE)
    stdout, stderr = p.communicate()
    text = stdout.decode('utf-8')
    return text

Получаю текст
<b><font face="Times New Roman"><font size="4">&#1054;&#1073;&#1086;&#1089;&#1085;&#1086;&#1074;&#1072;&#1085;&#1080;&#1077; &#1085;&#1072;&#1095;&#1072;&#1083;&#1100;&#1085;&#1086;&#1081; (&#1084;&#1072;&#1082;&#1089;&#1080;&#1084;&#1072;&#1083;&#1100;&#1085;&#1086;&#1081;) &#1094;&#1077;&#1085;&#1099; </font></font></b>&#1082;&#1086;&#1085;&#1090;&#1088;&#1072;&#1082;&#1090;&#1072;


Все символы такие. Как вытащить символы в нужной для меня кодировке? Пытался использовать различные библиотеки на python, но они дают такой же результат. Может быть есть какая-то другая утилита для linux, с помощью которой можно вытащить текст?
  • Вопрос задан
  • 828 просмотров
Решения вопроса 2
@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...).
Ответ написан
Комментировать
@AlexMine Автор вопроса
Учусь
Нашел решение на этот вопрос, думаю это одно из нормальных решений в моем случае. Установил libreoffice на сервер, с помощью
import os

os.system('lowriter --headless --convert-to txt file.rtf")

Сконвертировал в txt файл, и уже из этого файла взял текст полностью.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Мне кажется должно быть наверное как-то возможно так:
try:
     # Python 2.6-2.7 
     from HTMLParser import HTMLParser
except ImportError:
     # Python 3+
     from html.parser import HTMLParser
h = HTMLParser()
return h.unescape(text)


P.S. Просто я в Python-е ни-в-зуб-ногой.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы