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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top