Problema al guardar archivo zip editado (docx)
Pregunta
Así que aquí es mi código:
<?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';
}
Su propósito es simple. Se abre un archivo test.docx, las búsquedas de todas las apariciones de una cadena "$ FIRST_AND_LAST_NAME" y reemplaza con "John Doe".
Funciona perfectamente en mi servidor de desarrollo de Windows (la cadena "John Doe" se encuentra en la docuemnt cuando lo abro).
No funciona en mi servidor de producción Lunux ( "$ FIRST_AND_LAST_NAME" cadena sigue ahí, no hay "John Doe").
No hay error o aviso, el "ok" se imprime sin ningún error. Me aseguré de que el archivo test.docx ha establecido privilegios a 777.
Solución 3
Ok, he utilizado una clase que encontré en phpclasses:
http://phpclasses.web4u.cz/package/6278-PHP-Edit-a-Zip-archive-in-pure-PHP-no-temporary-files.html
Este es el código de trabajo:
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();
}
}
Otros consejos
Si se vuelve a close()
falsa, hubo un error de escritura a cabo el archivo.
getStatusString
hacer llegar el mensaje de error exacto.
Añadir sleep(1)
antes $zip->addFromString('word/document.xml', $xmlString);
Funciona en mi Ubuntu 12.04
No se olvide de escribir la variable en la misma hora cuando se crea un archivo docx, me refiero a que nunca escribo FIRST_AND_LAST_NAME
y luego añadir un símbolo $
después de eso. Se crea diferente código XML.