Сценарий Word: документ → текст → save
Хаб word управляет приложением Microsoft Word — зеркало Excel-гайда. Данные с сайта или из таблицы подставляются в шаблон договора, затем save или PDF. LibreOffice Writer — libreoffice.
word, wordfile, LibreOffice
- word — приложение Word (этот сценарий). Нужен установленный Microsoft Word.
- wordfile — файловые операции без полного object model.
- libreoffice — Writer / ODT, если Word в контуре нет.
Не открывайте тот же путь в UI оператора, пока робот пишет: получите «файл используется».
wordfile — когда не нужен полный object model Word (быстрее и меньше диалогов). LibreOffice — когда Microsoft Word на машине робота нет. Этот гайд — про объект word: шаблон с плейсхолдерами, таблица, PDF.
Создать и открыть
- create($path, $text="") — новый файл, сразу можно вставить текст
- open — существующий шаблон с плейсхолдерами
- connect_by_hwnd — уже открытое окно Word
- save · close
- remove_info — вычистить свойство документа
- compare — сравнить два файла
$word->create("C:\\bots\\out\\act.docx", "");
$word->add_text("C:\\bots\\out\\act.docx", "Акт выполненных работ\n");
Пути абсолютные. На расписании относительный «акт.docx» ищется не там, где вы думаете.
Текст и абзацы
Шаблон с метками {{FIO}} удобно гонять через replace_text($path, $text, $new_text) — замена по файлу.
- add_text · get_text
- Абзацы: get_paragraphs_count, get_paragraph_text_by_number, set_paragraph_text_by_number, поиск get_paragraph_number_by_text
- Удалить абзац: by_number / by_text
$word->open("C:\\bots\\tpl\\dogovor.docx", false);
$word->replace_text("C:\\bots\\tpl\\dogovor.docx", "{{FIO}}", "Иванов И.И.");
$word->save("C:\\bots\\tpl\\dogovor.docx");
Источник ФИО — форма на сайте (формы) или ячейка Excel. open($path, $read_only=true) для правок вызывайте с false. Боевой шаблон лучше копировать в out средствами ОС и править копию.
Таблицы и картинки
Спецификацию из Excel проще вставить таблицей, чем абзацами. Печать страницы сайта в картинку — print_screen, затем add_image.
$word->add_table("C:\\bots\\out\\act.docx", array(
array("Позиция", "Кол-во", "Сумма"),
array("Услуга", "1", "1000")
));
add_table($path, $table) — массив массивов; длины строк могут не совпадать.
Экспорт в PDF
get_pages_count / get_page_count, текст страницы read_page, разрыв add_page_break.
В PDF/XPS: export_pages($inpath, $outpath, $from_page=1, $count=1, $timeout=3000) — формат по расширению .pdf / .xps, страницы с единицы. Постранично: export_all_pages. Либо convert($inpath, $outpath, $timeout=3000) — формат по расширению (docx↔doc и т.д.). Дальше склейка — сценарий PDF.
$word->export_pages( "C:\\bots\\out\\dogovor.docx", "C:\\bots\\out\\dogovor.pdf", 1, 10, 120 );
Сценарий: шаблон → ФИО → PDF
$out = "C:\\bots\\out\\dogovor.docx";
// скопируйте шаблон tpl → $out, не правьте боевой файл
$word->replace_text($out, "{{FIO}}", "Иванов И.И.");
$word->replace_text($out, "{{DATE}}", "27.08.2026");
$word->export_pages($out, "C:\\bots\\out\\dogovor.pdf", 1, 20, 180);
Источник ФИО — форма на сайте или ячейка Excel. replace_text и export_pages идут по пути файла. Если открывали через open — close с тем же путём, что открыли, иначе Word останется висеть до следующего тика расписания.
Диалоги и «файл залочен»
Word любит модалки: восстановление, макросы, «сохранить изменения». На машине робота отключите лишние подтверждения в самом Word. Если диалог всё же всплыл — UI Automation. Крайняя мера на тесте: kill (убьёт все процессы Word на машине).
Не оставляйте документ открытым до следующего тика расписания — очередь встанет.
FAQ
Word не установлен. Объект word не заменит его. wordfile / LibreOffice.
replace не сработал. В шаблоне другие кавычки/пробелы, чем в $text. Сначала get_text и сверьте фрагмент.
export_pages пустой PDF. Документ не сохранён, неверный диапазон страниц (счёт с 1, не с 0 — это не pdffile), Word показал диалог. Сначала save, потом export.
convert вернул false. Нет Word, файл залочен, неподдерживаемая пара расширений, малый timeout (секунды). Откройте файл руками на той же машине.
Поиск: word.