2010-07-19 12 views
5

Por lo tanto, necesito editar algunos textos en un documento de Word. Creé un documento de Word y lo guardé como XML. Se guarda correctamente (puedo abrir el archivo XML en MS Word y se ve exactamente como el original docx).Problema al editar el archivo de palabras en PHP

Entonces yo uso DOM PHP para editar un texto en el archivo (sólo dos líneas) (Editar - abajo ya está fijada versión de trabajo):

<?php 

$firstName = 'Richard'; 
$lastName = 'Knop'; 

$xml = file_get_contents('template.xml'); 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$doc->preserveWhiteSpace = false; 

$wts = $doc->getElementsByTagNameNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 't'); 

$c1 = 0; $c2 = 0; 
foreach ($wts as $wt) { 

    if (1 === $c1) { 
     $wt->nodeValue .= ' ' . $firstName; 
     $c1++; 
    } 

    if (1 === $c2) { 
     $wt->nodeValue .= ' ' . $lastName; 
     $c2++; 
    } 

    if ('First Name' === substr($wt->nodeValue, 0, 10)) { 
     $c1++; 
    } 

    if ('Last Name' === substr($wt->nodeValue, 0, 9)) { 
     $c2++; 
    } 

} 

$xml = str_replace("\n", "\r\n", $xml); 

$fp = fopen('final-xml.xml', 'w'); 
fwrite($fp, $xml); 
fclose($fp); 

Esta es ejecutado correctamente (sin errores). Estas dos líneas:

<w:t>First Name:</w:t> 
<w:t>Last Name:</w:t> 

se reemplazan con los siguientes:

<w:t>First Name: Richard</w:t> 
<w:t>Last Name: Knop</w:t> 

Sin embargo, cuando intento abrir el archivo final-xml.xml en MS Word, no se abre (Word congela) . Alguna sugerencia.

EDIT:

He intentado utilizar Levenstein():

$xml = file_get_contents('template.xml'); 
$xml2 = file_get_contents('final-xml.xml'); 

$str = str_split($xml, 255); 
$str2 = str_split($xml2, 255); 

$i = 0; 
foreach ($str as $s) { 
    $dist = levenshtein($s, $str2[$i]); 
    if (0 <> $dist) { 
     echo $dist, '<br />'; 
    } 
    $i++; 
} 

cual emite nada.

Que es raro. Cuando abro el archivo final-xml.xml en el bloc de notas, puedo ver claramente que esas dos líneas han cambiado.

Edit2:

Aquí está el archivo template.xml: http://uploading.com/files/61b2922b/template.xml/

+0

podría ser un problema de codificación de caracteres? –

+1

podría 'diff' el original y el resultado, para verificar que este es, de hecho, el único cambio que ha realizado? – mvds

+0

Voy a usar array_diff para tratar de diferenciar ambos archivos XML. –

Respuesta

7

Este es un problema relacionado con DOS vs finales de línea UNIX. Word 2007 no tolera un final de línea \n, requiere \r\n mientras que Word 2010 es más tolerante y acepta ambas versiones.

Para solucionar el problema de asegurarse de que reemplaza todas las líneas de UNIX rompe con los DOS antes de guardar el archivo de salida:

$xml = str_replace("\n", "\r\n", $xml); 

muestra completa:

archivos de Word
<?php 

$firstName = 'Richard'; 
$lastName = 'Knop'; 

$xml = file_get_contents('template.xml'); 

$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$doc->preserveWhiteSpace = false; 

$wts = $doc->getElementsByTagNameNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 't'); 

foreach ($wts as $wt) { 
    echo $wt->nodeValue; 

    if ('First Name:' === $wt->nodeValue) { 
     $wt->nodeValue = 'First Name: ' . $firstName; 
    } 

    if ('Last Name:' === substr($wt->nodeValue, 0, 10)) { 
     $wt->nodeValue = 'Last Name: ' . $lastName; 
    } 
} 

$xml = $doc->saveXML(); 

// Replace UNIX with DOS line endings 
$xml = str_replace("\n", "\r\n", $xml); 

$fp = fopen('final-xml.xml', 'w'); 
fwrite($fp, $xml); 
fclose($fp); 
?> 
+0

¡Genial! Eres un genio ¡Gracias! –

0

XML han almacenado ciertas sumas de comprobación cerca de la parte superior del dom (para mi recuerdo). Es posible que tenga que cambiar estos, como el tamaño o la suma de comprobación general.

Sé que este era mi problema cuando era lo suficientemente tonto como para hacer un archivo HTML en word y guardarlo, tiene miles de cosas inútiles que solo servían para empeorar la edición.

+1

No se trata de sumas de comprobación, solo son metadatos que Word actualizará una vez que el documento se haya guardado nuevamente. –

Cuestiones relacionadas