Pull to refresh

Конвертация Word-документов на php используя COM (windows+apache)

PHP *
Доброго времени суток Хабр!
Хочу немного рассказать о том, что нужно сделать при использования COM объекта для конвертирования файлов word в какой-нибудь из доступных форматов. Сам столкнулся со множеством проблем, облазил много форумов, русских мануалов практически нет. Решил написать, больше для себя, но вдруг кому-то еще пригодится?

Если у вас IIS, есть вероятность того, что вам это не понадобится, статья исключительно о настройке работы под Apache

Первая и основная проблема, которая вызывала разрыв мозга:
Call to undefined method variant::SaveAs()
при попытке сохранить документ.
Эксперименты часто приводили к ошибкам отсутствия свойства в объекте или ошибкам разбора документа, самая частая —
Fatal error: Uncaught exception 'com_exception'
with message 'Source: Unknown<br/>Description: Unknown'


Что нужно сделать для того, чтобы процесс все-таки заработал:
  1. Нужен виндовый сервер
  2. Установленный на нем пакет MsOffice (или не целый пакет, а только необходимые его части)
  3. Настройка разрешения для COM
    1. Далее идем в Start->Administrative Tools->Component Services
    2. Разворачиваем меню Component Services->Computers->My Computer->DCOM Config
    3. В списке ищем необходимые нам приложения COM (как правило все они начинаются со слов Microsoft… )
    4. Жмем правой кнопкой по интересующему выбираем Properties переходим на закладку Securety в секции Access Permissions ставим точку в Customize и жмем на кнопку Edit
    5. В появившемся окне жмем add и добавляем пользователя который имеет права на запуск apache (вводим в нижнее поле логин пользователя и жмем Check Names если все нормально, то винда его найдет, жмем ок)
    6. В списке выбираем добавленного пользователя и ставим ему галочку Remote Acceess
    7. Подтверждаем все изменения (жмем ok 2 раза)
    8. Повторить пункты 4-7 для нужных приложений

  4. Настройка apache
    1. После того, как права на COM розданы все в том же окне (Component Services) идем в раздел Services находим там apache жмем по нему правой кнопкой выбираем Properties переходим на вкладку Log On жмем на кнопку Browse вводим того же пользователя, которого указывали выше для COM объектов, жмем ок, вводим пароль для пользовательской учетки, чтобы apache мог запуститься жмем ок
    2. Перезапускаем apache, если все правильно, то перезапуск пройдет удачно

  5. Настройка php.ini
    1. Открываем php.ini
    2. Ищем секцию [COM]
    3. Раскоменчиваем строки:
      	com.allow_dcom = true
      	com.autoregister_typelib = true
      	com.autoregister_casesensitive = false
      	com.autoregister_verbose = true
      


      Ищем секцию Dynamic Extensions
      Добавляем строку:
      	extension=php com_dotnet.dll
      


      Перезапускаем apache
    4. Важно: после выставления прав на COM объекты нужно запустить word (по-крайней мере у меня без этого разрешения не сменились)
    5. Profit


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

    Далее можно использовать стандартные функции COM для работы с объектом, напрмер, так:

    com_load_typelib('Word.Application');
    
    $name = 'test.docx';
    $path = dirname(__FILE__) . "\\tmp\\". $name ;
    
    $word = new COM("word.application") or die ("Невозможно создать COM объект");
    $word->Documents->Open( $path );
    
    mkdir(dirname(__FILE__) . "\\tmp\\{$name}");
    $folder = dirname(__FILE__) . "\\tmp\\{$name}";
    $word->ActiveDocument->SaveAs( $folder . "\\{$name}.html", 8);
    $word->Quit();
    $word = null;
    
Tags:
Hubs:
Total votes 14: ↑7 and ↓7 0
Views 8.1K
Comments Comments 10