Итак, вот мой код:
<?php $zip = new ZipArchive; if ($zip->open('test.docx') === TRUE) { $xmlString = $zip->getFromName('word/document.xml'); $xmlString = str_replace('$FIRST_AND_LAST_NAME', 'John Doe', $xmlString); $zip->addFromString('word/document.xml', $xmlString); echo 'ok'; $zip->close(); } else { echo 'failed'; }
Его цель проста. Он открывает файл test.docx, ищет все вхождения строки «$ FIRST_AND_LAST_NAME» и заменяет их «John Doe».
Он отлично работает на моем сервере разработки Windows (строка «John Doe» находится в документе, когда я его открываю).
Он не работает на моем производственном сервере Lunux (строка $ FIRST_AND_LAST_NAME) все еще существует, нет «John Doe»).
Нет ошибки или уведомления, «ok» печатается без каких-либо ошибок. Я убедился, что файл test.docx имеет привилегии, установленные на 777.
Если close()
возвращает false, произошла ошибка с записью архива.
Используйте getStatusString
для получения точного сообщения об ошибке.
Добавить sleep(1)
перед $zip->addFromString('word/document.xml', $xmlString);
Он работает на моем Ubuntu 12.04
Не забудьте ввести переменную в то же время, когда вы создаете файл docx, я имею в виду никогда не набирать FIRST_AND_LAST_NAME
а затем после этого вы добавляете символ $
. Он создает другой XML-код.
Хорошо, я использовал класс, который я нашел в phpclasses:
http://phpclasses.web4u.cz/package/6278-PHP-Edit-a-Zip-archive-in-pure-PHP-no-temporary-files.html
Вот рабочий код:
private function GenerateDocx($theTemplate, array $theReplacemenArray, $theOutputFile) { $aSearchArray = array(); foreach(range('A','Z') as $aLetter) { $aSearchArray[] = str_repeat($aLetter, 5); } $aArrayCountDifference = count($aSearchArray) - count($theReplacemenArray); $aSearchArray = array_slice($aSearchArray, 0, -$aArrayCountDifference); require_once('tbszip.php'); $tbszip = new clsTbsZip(); $tbszip->Open($theTemplate); $aXmlPath = 'word/document.xml'; if (true === $tbszip->FileExists($aXmlPath)) { $aXmlString = $tbszip->FileRead($aXmlPath); $aXmlString = str_replace($aSearchArray, $theReplacemenArray, $aXmlString); if (1 != $tbszip->FileReplace($aXmlPath, $aXmlString)) { throw new Exception('FileReplace() failed.'); } $tbszip->Flush(TBSZIP_FILE, $theOutputFile); $tbszip->Close(); } }