RTF в текст: убрать управляющие слова, оставить слова
Многие открывают для себя RTF тяжёлым путём. У вас папка файлов .rtf, содержимое нужно в базе
данных, и раз формат технически является обычным ASCII, кажется, что можно просто прочитать файл — и
готово. Потом вы смотрите на то, что загрузили, и это
{\rtf1\ansi\deff0{\fonttbl{\f0\froman Times
New Roman;}}{\colortbl;\red0\green0\blue0;}\viewkind4\uc1\pard\f0\fs24 Dear Sir,\par — и ещё
килобайта четыре такого до второго предложения письма.
RTF — это текст, но текст, обёрнутый в язык разметки, и чтобы вытащить слова, нужно по-настоящему разбирать управляющие слова, а не с надеждой гонять regex по бэкслешам. Именно это здесь и происходит. Извлеките текст из RTF файла — и получите прозу в порядке чтения и ничего больше. Бесплатно, без регистрации, лимит 50 МБ, у нас ничего не сохраняется.
Почему наивная вырезка ломается
Заманчиво написать функцию на двадцать строк, удаляющую всё, что начинается с бэкслеша. Она работает на первых трёх файлах, а остальные тихо портит. Конкретные способы, которыми она ломается, стоит знать, даже если вы никогда не напишете такую функцию, — потому что это те же вещи, с которыми должен справляться настоящий парсер:
- Группы заголовка — не содержимое. Таблица шрифтов, таблица цветов, таблица стилей и таблица правок сидят в начале файла в фигурных скобках. Вырежьте управляющие слова, но оставьте текст внутри этих групп — и ваш вывод начнётся со списка названий гарнитур.
- Фигурные скобки несут смысл. Группы вкладываются и ограничивают область действия
форматирования. Некоторые группы —
\*\generator,\info, данные встроенных объектов — надо выбрасывать целиком, а не разворачивать. - Экранирования выглядят как содержимое.
\'92— это настоящий символ, а не управляющее слово на удаление. Уберите его — и каждый апостроф в документе исчезнет посреди слова. - Внутри прячется бинарь. Картинки живут в группах
\pictдлинными последовательностями шестнадцатеричных цифр, которые для глупого фильтра выглядят в точности как обычный текст. Так и получаются 40 000 символов0100090000посреди письма. - Маркеры абзацев важны.
\parдолжен стать переводом строки, а не ничем, иначе весь документ приедет одним гигантским слитным абзацем.
Где RTF встречается оптом
Ни у кого нет трёх RTF-файлов. У людей их три тысячи, потому что какая-то система стабильно выдаёт их с 2004 года. Обычные подозреваемые:
- Юридический процесс раскрытия и материалы дел. Стенограммы, ходатайства и переписка, выгруженные из систем ведения дел, часто одной плоской папкой с криптическими именами файлов.
- Клиническая документация. Надиктованные записи, выписные эпикризы и направления, хранящиеся RTF-блобами в таблицах медицинских систем — обычно потому, что вендор выбрал формат в 2003 году и с тех пор ничто не заставило его поменять.
- Государственные архивы. Выбраны по той же причине, что и в судах: открытая, стабильная спецификация, которая откроется и через тридцать лет.
- Старые почтовые архивы. Режим rich text в Outlook — это RTF под кожей, поэтому он постоянно выпадает из извлечения писем MSG.
- Экспорт из легаси-приложений. Любая CRM, хелпдеск или корпоративный инструмент с rich-text-полем из эпохи до веб-редакторов почти наверняка хранит в колонке RTF.
- Документы WordPad. Десятилетия неформальных заметок и инструкций, сохранённых людьми, которые пользовались тем, что Windows открывала по умолчанию.
Общая нить: это архивы, по которым вы хотите искать, которые хотите индексировать или задавать по ним вопросы — а это ровно та работа, для которой и существует обычный текст.
Кодировка — то, что действительно кусается
Большинство проблем с RTF в дикой природе — это проблемы кодировки символов, а не структуры. Формат спроектирован до того, как устоялся Unicode, и старые файлы несут эту историю в себе.
Заголовок объявляет кодовую страницу — \ansicpg1252 для западноевропейской Windows встречается
чаще всего, но вы встретите и \ansicpg1251 для кириллицы, и \ansicpg1250 для
Центральной Европы, и \mac для файлов, начавших жизнь на классическом Macintosh. Не-ASCII
символы затем появляются шестнадцатеричными экранированиями вроде \'92 или \'e9,
смысл которых целиком зависит от этой декларации. Ошибитесь — и «é» станет кириллической буквой, а
типографский апостроф — квадратиком.
Более новые файлы используют \uN? — кодовую точку Unicode с запасным символом для читалок,
слишком старых, чтобы её понять. Разобрано правильно — вы получаете настоящий символ; разобрано небрежно —
запасной, а это часто буквальный вопросительный знак. Отсюда документы, где каждое длинное тире и каждая
«умная» кавычка превратились в ?.
Поэтому: прежде чем заливать партию в базу, откройте два-три сконвертированных файла и посмотрите именно на апострофы, кавычки, тире и любые имена с диакритикой. Эти четыре вещи скажут вам, была ли кодировка прочитана правильно. Если они сломаны — сломаны они последовательно, и поиск с заменой по всей партии чинит всё за один проход.
Текст или Markdown? Решающий вопрос
Всё сводится к тому, есть ли в документе таблицы, которые вам важны.
Таблицы в RTF задаются явно через \trowd и \cellx, поэтому в Markdown они чисто
реконструируются в таблицы с вертикальными чертами. Уплощите их в текст — все значения выживут, но колонка,
к которой относилось каждое, — нет: платёжная таблица превратится в вереницу чисел через пробелы, и никакие
промпты не вернут колонки обратно. Если ваш документ таков, используйте
RTF в Markdown. Переключатель
формата в верхней части страницы переводит туда и сохраняет уже выбранный файл.
Для всего остального — письма, заметки, стенограммы, служебные записки, переписка, то есть большая часть
того, для чего RTF реально используется, — текст лучше. Это то, чего хотят индексы полнотекстового поиска,
то, что конвейеры эмбеддингов режут по умолчанию, то, что читает grep, и то, чего ждёт
классификатор. Звёздочки и вертикальные черты Markdown были бы просто символами, которые вы на следующем
шаге снова вычищаете.
Как пройти большую партию
- Запакуйте папку. ZIP в текст конвертирует все поддерживаемые файлы внутри архива за один проход — куда лучше, чем загружать их по одному. Помните о потолке 50 МБ: RTF не сжат, и файлы со встроенными картинками намного больше, чем подсказывает их объём текста.
- Сначала выборка, потом вся партия. Сконвертируйте для начала пять файлов из разных лет. Проблемы кодировок кучкуются по эпохам и по инструментам, которые их породили, — и выборка покажет закономерность до того, как вы обработаете три тысячи.
- Сохраняйте имена файлов как метаданные. Когда всё стало плоским текстом, имя файла может оказаться единственным оставшимся происхождением. Храните его рядом с каждой записью.
- Ждите шаблонного текста. Шапки бланков, подвалы и стандартные подписи повторяются в каждом файле корпуса. В любом частотном или тематическом анализе они становятся ложно частотной лексикой — вычищайте их, как только заметите закономерность.
- Следите за обрывами. Немало инструментов выдаёт слегка несоответствующий спецификации RTF с несбалансированными скобками. Если сконвертированный файл обрывается на середине предложения, это исходник битый, а не конвертация молча упала — откройте оригинал в текстовом редакторе, и обычно видно, где всё идёт не так.
- Проверяйте число токенов. Счётчик под результатом говорит, во что обходится документ, до того как вы его куда-то вставите, — удобно, когда решаете, сколько архива поместится в один промпт.
RTF, DOCX — и какой из них конвертировать
Если документ существует в обоих видах, берите DOCX. Он несёт полноценную иерархию стилей и более богатую семантику, а Word в текст — более близкий современный аналог этой страницы.
Но у RTF есть одно реальное преимущество для массового извлечения текста, и это не ностальгия: он — единый линейный поток без слоя сжатия. Нет zip-контейнера, который может побиться, нет XML-частей, ссылающихся друг на друга. Когда что-то идёт не так, файл можно открыть в любом редакторе и прочитать причину собственными глазами. На нескольких тысячах файлов неизвестного происхождения такая предсказуемость стоит удивительно много.
Часто задаваемые вопросы
Как извлечь текст из RTF файла?
Перетащите .rtf в конвертер выше. Управляющие слова разбираются по-настоящему, и вы получаете прозу в порядке чтения без какой-либо разметки. Бесплатно, без регистрации, до 50 МБ на файл, ничего не сохраняется. Скачайте как .txt или скопируйте.
Почему нельзя просто открыть RTF в текстовом редакторе?
Можно, и вы увидите {\rtf1\ansi\deff0{\fonttbl{\f0\froman Times New Roman;}}, а за ним ещё несколько килобайт до второго предложения письма. RTF — это ASCII, но ASCII, обёрнутый в язык разметки. Слова там есть — вперемешку с таблицами шрифтов, таблицами цветов и управляющими словами, которые нужно разбирать, а не убирать сопоставлением по шаблону.
Почему самостоятельная вырезка бэкслешей даёт битый вывод?
Потому что управляющие слова не разделены единообразно, а некоторые несут данные, которые нужно сохранить. Regex, удаляющий всё после бэкслеша, удаляет и \'e9 — а именно так RTF кодирует символ с диакритикой, — так что каждое имя с надстрочным знаком молча теряет буквы. Работает на первых трёх файлах и тихо портит остальные.
Выживают ли символы с диакритикой и неанглийский текст?
Да — когда файл корректно объявляет свою кодировку, а так делает большинство. RTF экранирует не-ASCII символы шестнадцатеричными последовательностями, привязанными к объявленной кодовой странице, и правильный разбор преобразует их обратно в настоящий Unicode. Это самый частый провал самодельной вырезки — и тот, что наносит больше всего урона датасету имён или адресов.
Конвертируются ли таблицы в RTF-документе?
Содержимое ячеек проходит, но сплошным текстом, а не сеткой — у обычного текста нет способа выразить колонку. Если документ — отчёт, построенный вокруг таблиц, RTF в Markdown сохранит строки и колонки в виде таблиц с вертикальными чертами.
Остальной инструментарий
RTF — один из тринадцати поддерживаемых форматов. File2Txt обрабатывает их все через одну загрузку, если не хочется выбирать страницу. По соседству: PDF в текст для документов с фиксированной вёрсткой, EPUB в текст для электронных книг, HTML в текст для сохранённых страниц и XML в текст для второго легаси-формата обмена данными.
Работаете с кодом или живым вебом? Есть конвертер репозитория GitHub в текст, версия для GitLab, конвертер локальной папки и Web2Txt для скрейпинга URL. Руководство по подготовке документов для LLM разбирает общий случай всего этого.
Repo2Txt создаёт и поддерживает v12hero — независимый разработчик, который делает нативные и веб-приложения с приоритетом приватности.