среда, 29 июня 2011 г.

Парсим текст из .doc файла


Задача получения текста из .doc файла возникает нередко и способов решения масса - это и COM объекты под Windows, и сухие реализации на чистом php (хорошие и не очень), и разнообразные библиотеки для всех мыслимых и нет языков программирования. Однако хакерский подход, как известно, заключается в максимальной простоте, универсальности и обходе большинства проблем в лоб:). Поэтому воспользуемся готовым проверенным временем и миллионами мух решением - Antiword.

Antiword - консольная утилита для получения plain текста из файлов Microsoft Word версий 2, 6, 7, 97, 2000, 2002 и 2003. Иными словами, с новым форматом docx Antiword не работает, и если есть необходимость интегрирации с ним, придется искать другое решение. Я писал парсер doc файлов для загрузки данных в БД, поэтому мою задачу утилита решает на ура.

Итак, скачать Antiword можно на официальном сайте - есть версии для Windows и Linux. Качаем архив, распаковываем его в C:\Antiword\ (я буду рассматривать Windows, Linux команды аналогичны), запускаем консоль. Тестим!

C:\Antiword\antiword.exe C:\myDocument.doc

Собственно все уже работает - неплохо для одной простой команды, верно? Здесь C:\myDocument.doc это документ, текст которого нас интересует. При таком вызове команды результат работы будет полностью выведен в консоль, причем не всегда в приятной кодировке. Чтобы настроить вывод текста в кодировке cp1251 (стандартная кодировка для кириллицы в Windows), необходимо модифицировать команду следующим образом:

C:\Antiword\antiword.exe -m cp1251.txt C:\myDocument.doc

Теперь текст выводится в кодировке cp1251. Все равно крякозябры? Да у вас не настроена консоль, батенька! Исправляем установкой шрифта терминала Lucida Console и выполнением команды:

chcp 1251

Теперь все ок? Так-то. Хорошо, но как вывести plain текст в файл? О, да вы еще и о перенаправлении стандартного вывода в файл не слышали:)

C:\Antiword\antiword.exe -m cp1251.txt C:\myDocument.doc >> C:\plainText.txt

Теперь текст из вордовского файла C:\myDocument.doc магическим образом помещен в txt документ C:\plainText.txt.

В процессе конвертирования Antiword старается сохранить форматирование текста максимально близко к оригиналу. В частности, он вставляет переносы строк в соответствии со стандартной шириной страницы, изменить это поведение можно указанием параметра -w, который принимает количество символов в одной строке. Указав 0, мы отключаем режим переноса строк и все абзацы будут помещены в одну длинную строку:

C:\Antiword\antiword.exe -m cp1251.txt -w 0 C:\myDocument.doc >> C:\plainText.txt

В случае необходимости использования функционала Antiword в своей программе, просто вызывайте эту команду с подстановкой нужных параметров и считывайте результат из текстового файла или стандартного вывода. В случае php:

$fileContent = shell_exec("C:\Antiword\antiword.exe -m cp1251.txt -w 0 C:\myDocument.doc");

Таким образом, в переменную $fileContent будет загружен полный текст документа в виде строки. Для вашего языка программирования воспользуйтесь аналогичной функцией вызова системных команд.

И не забывайте принцип KISS - Keep It Simple, Stupid:)

Комментариев нет:

Отправить комментарий