Что ж продолжим наши изыскания на предмет получения текста из различных форматов данных. Не так давно мы с вами научились вытаскивать текст из zipped-xml-based файлов (odt и docx), а также, в начале этой недели, из pdf . Сегодня мы продолжим с обещанным rtf.
Rich Text Format (он же rtf), вы могли бы подумать, достаточно забытый, хотя и не очень сложный формат представления текстовых данных. Что ж, относительно несложный для получения текста, но за свою историю: от своей первой версии до текущей 1.9.1 - он приобрёл под 300 страниц официально документации и огромное количество надстроек, которые в большей степени нам будут мешать при получении plain text"а. Попробуем их обойти...
Что мы видим? Я вижу наше любимое стихотворение «Парус». Мы видим изначально текстовый 8-битный формат данных. Это уже радует - когда в исходных данных текст, понимать, что происходит, гораздо проще. Теперь давайте разберёмся, как эти самые данные прочитать. Для этого я расскажу немного теории по теме.
Будем считать, что rtf состоит из управляющих слов , которые могут быть сгруппированы во вложенные множества. Управляющие слово начинается на обратный слэш (\), группа обёрнута в фигурные скобки ({ и }).
Управляющие слово состоит из последовательности букв английского алфавита (от a до z) и может быть завершено численным параметром (возможно отрицательным). Как вариант, слово может содержать один не цифро-буквенный ascii-символ. Всё, что не подпадает под эти правила, не является частью управляющего слова. Таким образом, последовательность вида \rtf1\ansi\ansicpg1251 без проблем делится на три слова rtf с параметром 1 (major-версия формата), ansi (текущая кодировка) и ansicpg с параметром 1251 (текущая кодовая страница под номером 1251 - т.е. Windows-1251).
Группированные множества определяют область действия управляющих слов. Таким образом, управляющие слова описанные внутри фигурных скобок работают только внутри них и всех дочерних подмножеств. Для того, чтобы правильно отработать какие слова имеют место сейчас - требуется вести стек управляющих слов. При открытии фигурной скобки создавать новый элемент-массив в стеке, в который сразу же добавлять данные предыдущего слоя стека, при закрытии скобки - удалять самый верхний слой.
Ещё стоит отметить, что некоторые управляющие слова могут быть закрыты с помощью добавления параметра ноль, а не создания новой подгруппы. Например, следующие варианты эквивалентны: This is {\b bold} text , This is \b bold \b0 text = This is bold text .
Во-первых, стоит отметить, что исходная кодировка rtf-файла - это ANSI, поэтому без всякий изысков сохранится только, английский текст. Нас же интересует, как минимум, русский текст, а ещё лучше Unicode, не так ли? Что правда, то правда - rtf хоть и старый формат, но сгодится на сохранение и того и другого.
Итак, в rtf"е есть возможность использования второй половины таблицы ASCII, та что от 128 и выше. С учётом текущей кодировки (выше управляющее слово \ansicpg), конечно же. Для этого в RTF была введена последовательность вида \"hh , где hh - это двоичный hex-код символа из таблицы ASCII.
Ну и второй, более интересный вариант, это unicode-кодированные данные. Для них в формат включено лаконично короткое ключевое слово \uABCD с цифровым параметром ABCD. ABCD в данном случае код unicode-символа в десятичной системе счисления. Всё опять просто, как вы могли заметить.
Просто, да не очень. В rtf существует ещё одно ключевое слово \ucN , которое тесно связано с Unicode. Дело в том, что формат RTF очень рьяно поддерживает совместимость со старыми устройствами, на которых возможно придётся открывать данный файл. Как вариант, подобное устройство (ну например компьютер с Windows 3.11:) не сможет прочитать Unicode, что ему делать? Для этого после каждого unicode-символа, шифрованного ключевым словом \u может быть указано от нуля до нескольких символов, которые должны быть отображены в случае, если rtf-viewer не способен отобразить или разобрать текущие данные (по документации, если просмотрщик не может отобразить верно данные, он должен их пропустить).
В связи с этим, большинство современных редакторов после unicode-управляющего слова ставят символ вопроса, как знак, что требуется показать вместо текущего символа. Но возможны и варианты, например: Lab\u915GValue . Зададимся вопросом - сколько символов требуется отобразить, если нет возможности показать Unicode. Всё опять же не очень сложно - указанное выше ключевое слово \ucN в качестве параметра N как раз и предоставляет это значение. Т.е. перед Unicode-данными обязательно появится что-то типа \uc1 , что скажет нам пропустить один символ после unicode"а.
Код с комментариями вы можете получить на
- function rtf_isPlainText($s ) {
- $failAt = array ("*" , "fonttbl" , "colortbl" , "datastore" , "themedata" ) ;
- for ($i = 0 ; $i < count ($failAt ) ; $i ++ )
- if (! empty ($s [ $failAt [ $i ] ] ) ) return false ;
- return true ;
- function rtf2text($filename ) {
- $text = file_get_contents ($filename ) ;
- if (! strlen ($text ) )
- return "" ;
- $document = "" ;
- $stack = array () ;
- $j = - 1 ;
- for ($i = 0 ; $i < strlen ($text ) ; $i ++ ) {
- $c = $text [ $i ] ;
- switch ($c ) {
- case "\\ " :
- $nc = $text [ $i + 1 ] ;
- if ($nc == "\\" && rtf_isPlainText($stack [ $j ] ) ) $document .= "\\" ;
- elseif ($nc == "~" && rtf_isPlainText($stack [ $j ] ) ) $document .= " " ;
- elseif ($nc == "_" && rtf_isPlainText($stack [ $j ] ) ) $document .= "-" ;
- elseif ($nc == "*" ) $stack [ $j ] [ "*" ] = true ;
- elseif ($nc == """ ) {
- $hex = substr ($text , $i + 2 , 2 ) ;
- $document .= html_entity_decode ("" . hexdec ($hex ) . ";" ) ;
- $i += 2 ;
- } elseif ($nc >= "a" && $nc <= "z" || $nc >= "A" && $nc <= "Z" ) {
- $word = "" ;
- $param = null ;
- for ($k = $i + 1 , $m = 0 ; $k < strlen ($text ) ; $k ++, $m ++ ) {
- $nc = $text [ $k ] ;
- if ($nc >= "a" && $nc <= "z" || $nc >= "A" && $nc <= "Z" ) {
- if (empty ($param ) )
- $word .= $nc ;
- else
- break ;
- } elseif ($nc >= "0" && $nc <= "9" )
- $param .= $nc ;
- elseif ($nc == "-" ) {
- if (empty ($param ) )
- $param .= $nc ;
- else
- break ;
- } else
- break ;
- $i += $m - 1 ;
- $toText = "" ;
- switch (strtolower ($word ) ) {
- case "u" :
- $toText .= html_entity_decode ("" . dechex ($param ) . ";" ) ;
- $ucDelta = @ $stack [ $j ] [ "uc" ] ;
- if ($ucDelta > 0 )
- $i += $ucDelta ;
- break ;
- case "par" : case "page" : case "column" : case "line" : case "lbr" :
- $toText .= "\n " ;
- break ;
- case "emspace" : case "enspace" : case "qmspace" :
- $toText .= " " ;
- break ;
- case "tab" : $toText .= "\t " ; break ;
- case "chdate" : $toText .= date ("m.d.Y" ) ; break ;
- case "chdpl" : $toText .= date ("l, j F Y" ) ; break ;
- case "chdpa" : $toText .= date ("D, j M Y" ) ; break ;
- case "chtime" : $toText .= date ("H:i:s" ) ; break ;
- case "emdash" : $toText .= html_entity_decode ("—" ) ; break ;
- case "endash" : $toText .= html_entity_decode ("-" ) ; break ;
- case "bullet" : $toText .= html_entity_decode ("" ) ; break ;
- case "lquote" : $toText .= html_entity_decode ("‘" ) ; break ;
- case "rquote" : $toText .= html_entity_decode ("’" ) ; break ;
- case "ldblquote" : $toText .= html_entity_decode ("«" ) ; break ;
- case "rdblquote" : $toText .= html_entity_decode ("»" ) ; break ;
- default :
- $stack [ $j ] [ strtolower ($word ) ] = empty ($param ) ? true : $param ;
- break ;
- if (rtf_isPlainText($stack [ $j ] ) )
- $document .= $toText ;
- $i ++;
- break ;
- case "{" :
- array_push ($stack , $stack [ $j ++ ] ) ;
- break ;
- case "}" :
- array_pop ($stack ) ;
- $j --;
- break ;
- case "\0" : case "\r" : case "\f" : case "\n" : break ;
- default :
- if (rtf_isPlainText($stack [ $j ] ) )
- $document .= $c ;
- break ;
- return $document ;
Главный писатель по вопросам технологий
Вам кто-то послал по электронной почте файл RTF, и вы не знаете, как его открыть? Может быть, вы нашли файл RTF на вашем компьютере и вас заинтересовало, что это за файл? Windows может сказать вам, что вы не можете открыть его, или, в худшем случае, вы можете столкнуться с соответствующим сообщением об ошибке, связанным с файлом RTF.
До того, как вы сможете открыть файл RTF, вам необходимо выяснить, к какому виду файла относится расширения файла RTF.
Tip: Incorrect RTF file association errors can be a symptom of other underlying issues within your Windows operating system. These invalid entries can also produce associated symptoms such as slow Windows startups, computer freezes, and other PC performance issues. Therefore, it highly recommended that you scan your Windows registry for invalid file associations and other issues related to a fragmented registry.
Файлы RTF имеют Текстовые файлы, который преимущественно ассоциирован с Rich Text Format File.
Иные типы файлов также могут использовать расширение файла RTF. Если вам известны любые другие форматы файлов, использующие расширение файла RTF, пожалуйста, свяжитесь с нами , чтобы мы смогли соответствующим образом обновить нашу информацию.
Самый быстрый и легкий способ открыть свой файл RTF - это два раза щелкнуть по нему мышью. В данном случае система Windows сама выберет необходимую программу для открытия вашего файла RTF.
В случае, если ваш файл RTF не открывается, весьма вероятно, что на вашем ПК не установлена необходимая прикладная программа для просмотра или редактирования файлов с расширениями RTF.
Если ваш ПК открывает файл RTF, но в неверной программе, вам потребуется изменить настройки ассоциации файлов в вашем реестре Windows. Другими словами, Windows ассоциирует расширения файлов RTF с неверной программой.
Установить необязательные продукты - FileViewPro (Solvusoft) | | | |
Вы не уверены, какой тип у файла RTF? Хотите получить точную информацию о файле, его создателе и как его можно открыть?
Теперь можно мгновенно получить всю необходимую информацию о файле RTF!
Революционный RTF Инструмент анализа файлов™ сканирует, анализирует и сообщает подробную информацию о файле RTF. Наш алгоритм (ожидается выдача патента) быстро проанализирует файл и через несколько секунд предоставит подробную информацию в наглядном и легко читаемом формате.†
Уже через несколько секунд вы точно узнаете тип вашего файла RTF, приложение, сопоставленное с файлом, имя создавшего файл пользователя, статус защиты файла и другую полезную информацию.
Чтобы начать бесплатный анализ файла, просто перетащите ваш файл RTF внутрь пунктирной линии ниже или нажмите «Просмотреть мой компьютер» и выберите файл. Отчет об анализе файла RTF будет показан внизу, прямо в окне браузера.
Просмотреть мой компьютер »
Пожалуйста, также проверьте мой файл на вирусы
Ваш файл анализируется... пожалуйста подождите.
Многие начинающие пользователи компьютера, столкнувшись с файлами неизвестного формата, в том числе и RTF, не знают, чем открыть их.
Обратите внимание. Для установки OpenOffice.org лицензия не требуется, что в свою очередь позволяет каждому желающему пользователю установить себе на ПК.Приложение Notepad2 также поддерживает работу с RTF форматом. Это небольшой, но достаточно быстрый редактор текстов с применением подсветки синтаксиса. Его интерфейс прост и привлекателен. Программа не требует установки.
Аббревиатура RTF обозначает «Rich Text Format», то бишь, «формат обогащённого текста». Или, попросту говоря, оформленного: с разными начертаниями, шрифтами, размерами и цветом букв. Во многих случаях этот формат, предназначенный для документов, может стать избавлением от неприятностей, поэтому получить о нём представление необходимо всем, кто пользуется компьютерами. Как всегда, в процессе знакомства с данным явлением непременно уделим внимание вопросам практичности.
Дело было в старину, в 1982-м году. В те далёкие времена, когда фирмы Microsoft и Adobe дружили. Им понадобилось придумать что-нибудь для новой программы - текстового процессора Word для MS DOS, выпуск которого был запланирован на 1893-й.
Недолго думая, взяли обычный текст и добавили к нему специальные тэги разметки (их нарекли управляющими символами). Мол, вот тут будет начинаться абзац, здесь текст следует отображать курсивом, там - полужирным, ну и так далее.
С тех пор много чего изменилось, но суть осталась прежней: RTF - это текстовые файлы, подобно документам HTML. Их можно открывать в текстовых редакторах вроде Блокнота в Windows и Gedit в Ubuntu, чтобы посмотреть на все те тэги, ежели возникнет желание.
Вскоре пути Microsoft и Adobe разошлись, но формат остался проприетарным. (Adobe решили использовать концепцию для другого языка разметки, PostScript, что позже привело к появлению PDF .) Ну а Microsoft выпустили последнюю спецификацию RTF в марте 2008-го. На неё и ориентируется современный электронно-цифровой мир.
Структура документа RTF довольно проста. В начале текстового блока указывается управляющий символ, перед которым ставится «\» (в смысле, черта, наклонённая влево). В частности, \b перед блоком полужирного шрифта, \i перед курсивом, \par перед абзацем.
Для обозначения самих блоков, поскольку нет закрывающих тэгов, применяются фигурные скобки {}. Следовательно, выделенное полужирным в исходном тексте выглядит вот так: {\b выделенное полужирным} , а курсивом - вот так: {\i привет, мир!} Ну а в самом начале указывается сам формат \rtf1:
{\rtf1 \par {\i Привет, мир!} Только что было приветствие курсивом. А теперь {/b немножко полужирного текста}. \par }
Это, конечно, очень простой пример. На самом деле через косые линии в ряд выстраивается изрядное количество всяких параметров: кодировка, язык и прочие данные. Что-нибудь вроде:
{\rtf1\ansi\deff3\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;} \par {\i Привет, мир, ещё раз!} Как видите, абракадабры {/b предостаточно} даже в маленьком фрагменте. \par }
Особенно много управляющих символов любят вставлять мощные текстовые процессоры вроде того же Word или LibreOffice Writer, размечая всё слишком уж дотошно.
Кроме того, русские буквы заменяются обозначениями байтов - символов кодировки (в примерах ради наглядности замена не показана). Это делает исходный код совершенно непригодным для чтения и раздувает его непомерно.
Кроме упомянутых выше Microsoft Word и LibreOffice Writer, существует множество менее мощных программ, RTF-редакторов. Однако далеко не все из них пригодны для работы.
FocusWriter - пожалуй, самый лучший из нынешних свободных RTF-редакторов. Можно прикручивать словари для проверки орфографии, используемые в LibreOffice Writer. И в Windows, и в Ubuntu работает очень шустро, занимает мало места и системные ресурсы не пожирает. Оформление интерфейса меняется на разные вкусы.
Упрямо запоминает и пытается при старте загрузить последний открывавшийся документ - пожалуй, это всё же недостаток. Предназначен, в первую очередь, для писателей , работающих над одной книгой, а не над несколькими сразу. В соответствии с той же концепцией панель инструментов прячется до наведения указателя мыши, чтобы ничто от работы не отвлекало.
Зато такой интерфейс очень удобен на нетбуках и прочих устройствах с небольшим дисплеем. Писать статьи, письма и всякие заметки - одно удовольствие.
Во-первых, текстовые файлы не заражаются вирусами, и в них невозможно запихнуть вредоносные макросы. Файлы *rtf совершенно безопасны, как и *txt. А вот *doc вполне способны преподнести неприятные сюрпризы.
Во-вторых, Rich Text Format понимают все современные текстовые процессоры и, конечно, RTF-редакторы во всех популярных операционных системах.
Ваш покорный слуга собственными глазами видел, как Word 2010 в Windows 7 наотрез отказался открывать *odt, изготовленный в LibreOffice. Сказал, мол, в файле содержится какая-то ошибка. Пришлось нести флэшку обратно на компьютер с Ubuntu (благо таковой находился в соседнем офисе) и конвертировать документ в RTF. После чего Word открыл файл без возражений.
Небольшие русскоязычные документы, страниц на десять-пятнадцать, можно сохранять в RTF смело. Места они займут немного, по современным меркам. А вот файлы *rtf с целыми романами раздуются неимоверно и при открытии потребуют изрядной нагрузки на процессор. Потому что буквы русского алфавита замещаются обозначениями байт кодировки, как сказано ранее.
Предположим, во время работы в Ubuntu вам нужно быстро сохранить небольшой текст, который потом понадобится открыть в Windows. Если вы создадите *txt в Gedit, то Блокнот, вполне вероятно, вместо букв покажет нечто инопланетное, не распознав кодировку автоматически.
Но если вы используете шустрый FocusWriter и изготовите *rtf, проблем не возникнет, всё отобразится нормально. Кодировка будет указана в исходном коде после \rtf1 .
Итак, Rich Text Format (он же RTF) отличается универсальностью и потому пригоден для создания и открытия оформленных текстов в разных операционных системах. Однако его лучше использовать только для небольших русскоязычных документов. Для англоязычных (и прочих с латинскими буквами) проблемы раздувания файлов нет.
В жизни всякое бывает, и если вдруг понадобится открыть документы в пока ещё популярной Windows, то на этот случай важные файлы, которые вы в Ubuntu держите в *odt, можно продублировать в *rtf. Потому что на компьютерах с ОС от Microsoft нередко присутствует Word, а не LibreOffice Writer.
Предыдущие публикации:
Extensions are some of the files associated or which can be opened with the Microsoft WordPad. RTF files are text documents that can be created, opened, viewed, edited or changed using word processing applications for both Mac and Microsoft Windows-based computers, like Microsoft WordPad for Windows and Microsoft Word 2011 for Mac. It gives the users a wide cross compatibility support, which was the central objective for the improvement of the Rich Text Format technology, and these .rtf files can even be opened, viewed and used with database applications. The OpenBSD Unix platform is frequently utilized in computers running as Web servers of a secure network. OpenBSD files may be saved in directories of the OpenBSD system that were generated upon installation of the software applications. Files with the .openbsd extension can be opened by standard text editors, particularly well-known like Microsoft Notepad, and this text editor may also be utilized to create and edit OPENBSD files. Files with the .readme extension are text documents engaged to give users with beneficial information and specific details about certain applications installed in the system. These files can be opened, viewed and edited with a selection of text editors including Microsoft Notepad and Microsoft WordPad.
Microsoft Notepad
Microsoft Works