Каковы доступные решения для PHP
для создания текстового документа в среде linux
?
Если вам нужно создать «реальные» документы Word, вам нужен веб-сервер на базе Windows и автоматизация COM. Я настоятельно рекомендую статью Джоэла по этому вопросу.
Довольно распространенной (но ненадежной) альтернативой является:
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.
Для облегчения каждого из этих шагов доступны инструменты и библиотеки.
Может быть, это помогает.
Самым простым способом создания файлов DOC в Linux, используя PHP, является компонент Zend Framework phpLiveDocx .
На веб-сайте проекта:
phpLiveDocx позволяет разработчикам создавать документы, комбинируя структурированные данные с PHP с шаблоном, созданным в текстовом редакторе. Результирующий документ может быть сохранен как файл PDF, DOCX, DOC или RTF. Концепция такая же, как и с помощью слияния почты «.
OpenTBS может создавать динамические документы DOCX на PHP с использованием технологии шаблонов.
Никаких временных файлов не требуется, нет команд, все в PHP.
Он может добавлять или удалять фотографии. Созданный документ может быть создан как загрузка HTML, файл, сохраненный на сервере, или как двоичное содержимое в PHP.
Он также может объединять файлы OpenDocument (ODT, ODS, ODF, …)
Следуя ответу Ивана Кречетова, вот функция, которая выполняет слияние (фактически простое замену текста) для 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