2010-07-19 4 views
5

J'ai donc besoin d'éditer du texte dans un document Word. J'ai créé un document Word et l'ai enregistré en tant que XML. Il est enregistré correctement (je peux ouvrir le fichier XML dans MS Word et il ressemble exactement à l'original docx).Problème lors de la modification du fichier Word en PHP

donc j'utiliser PHP DOM pour modifier un texte dans le fichier (seulement deux lignes) (EDIT - ci-dessous est déjà fixe version de travail):

<?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); 

Ceci est exécuté correctement (aucune erreur). Ces deux lignes:

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

Get avec ces remplacés:

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

Cependant, lorsque je tente d'ouvrir le fichier final-xml.xml dans MS Word, il ne se ouvre pas (fige Word) . Aucune suggestion.

EDIT:

J'ai essayé d'utiliser 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++; 
} 

qui rien sorti.

Ce qui est bizarre. Lorsque j'ouvre le fichier final-xml.xml dans le bloc-notes, je peux clairement voir que ces deux lignes ont changé.

EDIT2:

Voici le fichier template.xml: http://uploading.com/files/61b2922b/template.xml/

+0

cela pourrait-il être un problème de codage de caractères? –

+1

pourriez-vous 'diff 'l'original et le résultat, pour vérifier que c'est en fait le seul changement que vous avez fait? – mvds

+0

Je vais utiliser array_diff pour essayer de différencier les deux fichiers XML. –

Répondre

7

Ce problème est lié à DOS vs fins de ligne UNIX. Word 2007 ne tolère pas une fin de ligne \n, il nécessite \r\n alors que Word 2010 est plus tolérant et accepte les deux versions.

Pour résoudre le problème assurez-vous que vous remplacez toutes les lignes UNIX rompt avec les DOS avant d'enregistrer le fichier de sortie:

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

Échantillon complet:

<?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

Super! Vous êtes un génie. Merci! –

0

fichiers Word XML ont certains checksums stockés près du sommet de la dom (à mon souvenir). Vous devrez peut-être les modifier, comme la taille ou la somme de contrôle générale elle-même.

Je sais que c'était mon problème quand j'étais assez (stupide) pour faire un fichier HTML en texte et le sauvegarder, il y avait des milliers de choses inutiles qui ne servaient qu'à rendre le montage pire.

+1

Ce ne sont pas des sommes de contrôle, ce sont juste des méta-données qui seront mises à jour par Word une fois le document sauvegardé à nouveau. –

Questions connexes