Проблема с редактированием файла слов в PHP - PullRequest
5 голосов
/ 19 июля 2010

Так что мне нужно отредактировать текст в документе Word.Я создал документ Word и сохранил его как XML.Он сохранен правильно (я могу открыть файл XML в MS Word, и он выглядит точно так же, как оригинал docx).

Итак, я использую PHP DOM для редактирования некоторого текста в файле (всего две строки) (РЕДАКТИРОВАТЬ- ниже уже исправлена ​​рабочая версия):

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

Это выполняется правильно (без ошибок).Эти две строки:

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

Заменить на эти:

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

Однако, когда я пытаюсь открыть файл final-xml.xml в MS Word, он не открывается(Слово замирает).Любые предложения.

РЕДАКТИРОВАТЬ:

Я пытался использовать 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++;
}

, который ничего не выводил.

Что странно.Когда я открываю файл final-xml.xml в блокноте, я ясно вижу, что эти две строки изменились.

EDIT2:

Вот файл template.xml: http://uploading.com/files/61b2922b/template.xml/

Ответы [ 2 ]

7 голосов
/ 19 июля 2010

Это проблема, связанная с окончанием строки DOS против UNIX.Word 2007 не допускает окончания строки \n, для него требуется \r\n, тогда как Word 2010 является более терпимым и принимает обе версии.

Чтобы устранить проблему, убедитесь, что вы заменили все разрывы строк UNIX на DOSперед сохранением выходного файла:

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

Полный образец:

<?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 голосов
/ 19 июля 2010

XML-файлы Word имеют определенные контрольные суммы, хранящиеся в верхней части домена (насколько я помню).Возможно, вам придется изменить их, например размер или саму общую контрольную сумму.

Я знаю, что это была моя проблема, когда я был достаточно (глуп), чтобы сделать HTML-файл в слове и сохранить его, в нем тысячибесполезных вещей, которые только ухудшали редактирование.

...