Создать документ Word с помощью PHP в Linux

Каковы доступные решения для PHP для создания текстового документа в среде linux ?

реальные документы Word

Если вам нужно создать «реальные» документы Word, вам нужен веб-сервер на базе Windows и автоматизация COM. Я настоятельно рекомендую статью Джоэла по этому вопросу.

поддельные заголовки HTTP для обмана Word в открытии необработанного HTML

Довольно распространенной (но ненадежной) альтернативой является:

 header("Content-type: application/vnd.ms-word"); header("Content-Disposition: attachment; filename=document_name.doc"); echo "<html>"; echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">"; echo "<body>"; echo "<b>Fake word document</b>"; echo "</body>"; echo "</html>" 

Убедитесь, что вы не используете внешние таблицы стилей. Все должно быть в одном файле.

Обратите внимание, что это не отправляет фактический документ Word. Он просто обманывает браузеры, предлагая его как загружать и не выполнять расширение файла .doc . Старые версии Word могут часто открывать это без предупреждения / сообщения безопасности и просто импортировать необработанный HTML в Word. PHP, отправляющий отправку этого вводящего в заблуждение заголовка Content-Type , не является реальным преобразованием формата файла.

PHPWord может создавать документы Word в формате docx. Он также может использовать существующий файл .docx в качестве шаблона – переменные шаблона могут быть добавлены в документ в формате $ {varname}

У этого есть лицензия LGPL, и примеры, которые пришли с кодом, работали хорошо для меня.

Шаблоны OpenOffice + интерфейс командной строки OOo.

  1. Создайте вручную шаблон ODT с заполнителями, например [% value-to-replace%]
  2. При создании экземпляра шаблона с реальными данными в PHP, разархивируйте шаблон ODT (это zipped XML) и запустите против XML текстовую замену заполнителей фактическими значениями.
  3. Zip ODT назад
  4. Запустите преобразование ODT -> DOC через интерфейс командной строки OpenOffice.

Для облегчения каждого из этих шагов доступны инструменты и библиотеки.

Может быть, это помогает.

Самым простым способом создания файлов DOC в Linux, используя PHP, является компонент Zend Framework phpLiveDocx .

На веб-сайте проекта:

phpLiveDocx позволяет разработчикам создавать документы, комбинируя структурированные данные с PHP с шаблоном, созданным в текстовом редакторе. Результирующий документ может быть сохранен как файл PDF, DOCX, DOC или RTF. Концепция такая же, как и с помощью слияния почты «.

OpenTBS может создавать динамические документы DOCX на PHP с использованием технологии шаблонов.

Никаких временных файлов не требуется, нет команд, все в PHP.

Он может добавлять или удалять фотографии. Созданный документ может быть создан как загрузка HTML, файл, сохраненный на сервере, или как двоичное содержимое в PHP.

Он также может объединять файлы OpenDocument (ODT, ODS, ODF, …)

http://www.tinybutstrong.com/opentbs.php

Следуя ответу Ивана Кречетова, вот функция, которая выполняет слияние (фактически простое замену текста) для docx и odt, без необходимости в дополнительной библиотеке.

 function mailMerge($templateFile, $newFile, $row) { if (!copy($templateFile, $newFile)) // make a duplicate so we dont overwrite the template return false; // could not duplicate template $zip = new ZipArchive(); if ($zip->open($newFile, ZIPARCHIVE::CHECKCONS) !== TRUE) return false; // probably not a docx file $file = substr($templateFile, -4) == '.odt' ? 'content.xml' : 'word/document.xml'; $data = $zip->getFromName($file); foreach ($row as $key => $value) $data = str_replace($key, $value, $data); $zip->deleteName($file); $zip->addFromString($file, $data); $zip->close(); return true; } 

Это заменит [Имя человека] Миной и [Фамилия человека] с помощью Mooo:

 $replacements = array('[Person Name]' => 'Mina', '[Person Last Name]' => 'Mooo'); $newFile = tempnam_sfx(sys_get_temp_dir(), '.dat'); $templateName = 'personinfo.docx'; if (mailMerge($templateName, $newFile, $replacements)) { header('Content-type: application/msword'); header('Content-Disposition: attachment; filename=' . $templateName); header('Accept-Ranges: bytes'); header('Content-Length: '. filesize($file)); readfile($newFile); unlink($newFile); } 

Помните, что эта функция может повредить документ, если строка для замены является слишком общей. Попытайтесь использовать вербальные строки замены, такие как [Имя человека].

Проект Apache имеет библиотеку POI, которая может использоваться для создания файлов MS Office. Это Java-библиотека, но преимущество в том, что она может работать на Linux без проблем. У этой библиотеки есть свои ограничения, но она может сделать эту работу для вас, и, вероятно, ее проще использовать, чем пытаться запустить Word.

Другим вариантом будет OpenOffice, но я не могу его точно рекомендовать, так как я никогда не использовал его.

 <?php function fWriteFile($sFileName,$sFileContent="No Data",$ROOT) { $word = new COM("word.application") or die("Unable to instantiate Word"); //bring it to front $word->Visible = 1; //open an empty document $word->Documents->Add(); //do some weird stuff $word->Selection->TypeText($sFileContent); $word->Documents[1]->SaveAs($ROOT."/".$sFileName.".doc"); //closing word $word->Quit(); //free the object $word = null; return $sFileName; } ?> <?php $PATH_ROOT=dirname(__FILE__); $Return ="<table>"; $Return .="<tr><td>Row[0]</td></tr>"; $Return .="<tr><td>Row[1]</td></tr>"; $sReturn .="</table>"; fWriteFile("test",$Return,$PATH_ROOT); ?> - <?php function fWriteFile($sFileName,$sFileContent="No Data",$ROOT) { $word = new COM("word.application") or die("Unable to instantiate Word"); //bring it to front $word->Visible = 1; //open an empty document $word->Documents->Add(); //do some weird stuff $word->Selection->TypeText($sFileContent); $word->Documents[1]->SaveAs($ROOT."/".$sFileName.".doc"); //closing word $word->Quit(); //free the object $word = null; return $sFileName; } ?> <?php $PATH_ROOT=dirname(__FILE__); $Return ="<table>"; $Return .="<tr><td>Row[0]</td></tr>"; $Return .="<tr><td>Row[1]</td></tr>"; $sReturn .="</table>"; fWriteFile("test",$Return,$PATH_ROOT); ?> 

Существует два варианта создания качественных текстовых документов. Используйте COM для связи со словом (для этого требуется, по крайней мере, php-сервер Windows). Используйте openoffice и его API для создания и сохранения документов в текстовом формате.

Взгляните на документы PHP COM (комментарии полезны) http://us3.php.net/com