среда, 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:)

Настройка кодировки консоли Windows


Проблема: полностью описана на картинке выше. Задача формулируется в получении из картинки слева картинки справа:). Предполагается, что выводимый текст находится в кодировке Windows-1251 (cp1251), вывод текста в соответствующей кодировке из программы является задачей непосредственно программы, в статье рассматривается вопрос отображения текста консолью.

Решение.

1. Выполните в консоли следующую команду

chcp 1251

2. Смените шрифт консоли на Lucida Console.

Вуаля!

Windows: deletion of service

Problem: some ugly Windows programs (such as Mail.ru Guard, i hate it!) use technology of services for permanent keeping its own code in RAM. It means that useless program spends your memory and it is a natural desire to delete it. But in case of mentioned Mail.ru Guard (and some other soft) simple operation of program removing don't removes the service and it will start every time with Windows.

But dont worry! There is simple method to stop and delete haunting service:)

Solution.

Run terminal as Administrator and perform this code:

sc delete service_name

where service_name is name of ugly service. For example:

sc delete "Guard.Mail.ru"

Be happy!

вторник, 21 июня 2011 г.

Vim: separate .swp files and sources of project


Do you want separate .swp files of Vim and source files of your project? Nothing is easier! Simple add in your .vimrc file this line:
set directory=C:\Temp\

пятница, 10 июня 2011 г.

Deploying servlets on Weblogic server with weblogic.Deployer


Good day!

I want to tell you about servlets deployment on Oracle Weblogic server. Its my first post in English, so sorry for my language - its not my native:)

So, we developed some Java servlets and want to deploy them on server for testing it. If you read this article, i can suggest, that you are interesting in Weblogic server. There are several ways to deploy servlets, for example using Weblogic Administration console or using weblogic.Deployer tool. I like command-line tools, because its really simple, fast and give me many ways to automate my work. Weblogic.Deployer - command-line utilite for fast deploying applications on weblogic server.

First, we need create war file (Web Application Archive, see wikipedia) with our servlets. In windows (unix's way is not so different) we need write this code in terminal:

chdir C:\dir\with\servlets\
jar -cvf  myServlets.war *

First line changes current directory to directory with our servlets. Second line creates one war file with all files of our servlets - html, css, js, WEB-INF directory with web.xml and so on. So we have myServlets.war file.

Now we can deploy it -  with weblogic.Deployer utilite it is really simple:

java -cp C:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic.jar weblogic.Deployer -adminurl t3://localhost:7001 -user myusername -password mycoolpass -deploy myServlets.war

Yeah! Is it not cool? Some notes. Weblogic must be started for work with weblogic.Deployer - deploying can be done only on the running server, of course. Also console application must be deployed (you can load url http://localhost:7001/console for it, its very simple). C:\Oracle\Middleware\wlserver_10.3\ is directory with installed Weblogic server. localhost:7001 is URL of my Weblogic Administrtion console (note that I use t3 instead of http protocol), myusername is username for administration console and mycoolpass is password for this account. So, we need just 2 commands for create war file and deploy it on server! 2 commands is too much? Ok, we can merge it:

jar -cvf  myServlets.war * && java -cp C:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic.jar weblogic.Deployer -adminurl t3://localhost:7001 -user myusername -password mycoolpass -deploy myServlets.war

This way of deploying java servlets is more fast than using web interface of administration console.

четверг, 9 июня 2011 г.

ExtJS 3 grid colspan или группировка колонок



Задача: необходимо объединить несколько колонок таблицы grid. В чистом HTML для этого существует атрибут colspan, но как реализовать это в элементах ExtJS?
В данной статье рассматривается третья версия ExtJS.

Решение.

Необходимо воспользоваться плагином ColumnHeaderGroup, пример использования которого можно посмотреть здесь.

Итак, для осуществления группировки колонок, необходимо:

  1. подключить js файл плагина (ColumnHeaderGroup.js)
  2. в коде Ext.onReady() описать заголовок таблицы следующим образом:

    // объявляем массив для хранения первой строки заголовка
    var row1 = [];
    // заполняем его
    row1.push({
      header: ''
    });
    row1.push({
      header: 'Ставка, руб./1 GT',
      colspan: '3',   // да-да, это аналог того самого colspan
      align: 'center' // выравнивание текста в ячейке
    });
  3. создать заголовок таблицы, используя плагин:

    groupedRows = new Ext.ux.grid.ColumnHeaderGroup({
      rows: [ row1 ]
    });

    В случае, если таких строк с объединенными колонками будет несколько - просто перечислите их черех запятую в массиве rows:

    groupedRows = new Ext.ux.grid.ColumnHeaderGroup({
      rows: [ row1, row2, row3 ]
    });


  4. подключить инициализированный плагин к таблице grid:

    grid = new Ext.grid.GridPanel({                
      xtype: 'grid',
      store: companiesStore,
      plugins: [ groupedRows ],
      border: false, frame: false,
      columns: columnModel
    });

Таким образом, заголовок таблицы делится на 2 типа строк - самая нижняя строка, описываемая в параметре columns модели GridPanel согласно всем стандартным правилам описания колонок таблицы grid, и все остальные строки, располагающиеся выше и объединяющие колонки при помощи плагина. Закомментируйте строку plugins: [ groupedRows ] и в заголовке останется только одна строка, нижняя, все верхние строки должны описываться как показано выше при инициализации плагина.

Описанный способ позволяет создавать сколь угодно сложные структуры заголовков таблиц.