保存已编辑的zip存档(docx)的问题

时间:2010-08-25 14:08:11

标签: php xml docx

所以这是我的代码:

<?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”字符串在docuemnt中。)

它在我的Lunux生产服务器上不起作用(“$ FIRST_AND_LAST_NAME”字符串仍然存在,没有“John Doe”)。

没有错误或通知,打印出“ok”没有任何错误。我确保test.docx文件的权限设置为777。

3 个答案:

答案 0 :(得分:1)

如果close()返回false,则写出存档时出错。

使用getStatusString获取确切的错误消息。

答案 1 :(得分:1)

sleep(1)

之前添加$zip->addFromString('word/document.xml', $xmlString);

适用于我的Ubuntu 12.04

在创建docx文件时不要忘记同时输入变量,我的意思是从不输入FIRST_AND_LAST_NAME,然后在此之后添加符号$。它创建了不同的XML代码。

答案 2 :(得分:0)

好的,我使用过在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();

    }
}