Поиск разрывов строк в файле docx с помощью PHP

#php #ms-office #document

#php #ms-office #документ

Вопрос:

Мой PHP-скрипт успешно считывает весь текст из файла .docx, но я не могу определить, где должны быть разрывы строк, поэтому текст сгруппирован и его трудно читать (один огромный абзац). Я вручную просмотрел все XML-файлы, чтобы попытаться разобраться, но я не могу это выяснить.

Вот функции, которые я использую для извлечения данных файла и возврата обычного текста.

     public function read($FilePath)
{
    // Save name of the file
    parent::SetDocName($FilePath);

    $Data = $this->docx2text($FilePath);

    $Data = str_replace("<", "amp;<", $Data);
    $Data = str_replace(">", "amp;>", $Data);

    $Breaks = array("rn", "n", "r");
    $Data = str_replace($Breaks, '<br />', $Data);

    $this->Content = $Data;
}

function docx2text($filename) {
    return $this->readZippedXML($filename, "word/document.xml");
}

function readZippedXML($archiveFile, $dataFile)
{
    // Create new ZIP archive
    $zip = new ZipArchive;

    // Open received archive file
    if (true === $zip->open($archiveFile))
    {
        // If done, search for the data file in the archive
        if (($index = $zip->locateName($dataFile)) !== false)
        {
            // If found, read it to the string
            $data = $zip->getFromIndex($index);

            // Close archive file
            $zip->close();

            // Load XML from a string
            // Skip errors and warnings
            $xml = DOMDocument::loadXML($data, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);

            $xmldata = $xml->saveXML();
            //$xmldata = str_replace("</w:t>", "rn", $xmldata);
            // Return data without XML formatting tags
            return strip_tags($xmldata);
        }

        $zip->close();
    }

    // In case of failure return empty string
    return "";
} 
  

Комментарии:

1. В каком порядке они используются? return strip_tags($xmldata); Являются ли возвращаемые данные, которые не содержат разрывов строк?

2. Чтобы использовать код, просто вызовите метод read(), и данные будут сохранены в $this-> Content. Разрывы строк XML есть, но не для документа. Просмотр XML документа очень сбивает с толку при попытке разобраться в любом типе форматирования.

3. Ах да, конечно. Удаляет ли saveXML() это? Я помню, что мне приходилось клонировать, а затем импортировать DOMDocument, затем использовать XPath для запроса основного элемента и использовать nodeValue для получения всего. Это кажется довольно экстремальным — вы уверены, что разрывы строк — это просто разрывы строк, а не какой-то специальный синтаксис Microsoft?

4. Хм, я не совсем уверен… Я ничего не знаю о DOMDocument. Вы когда-нибудь смотрели на XML-структуру файла DOCX? Это странным образом разбивает документ, я не могу понять, как можно различать абзацы, просматривая XML в документе, поэтому я не могу понять, как заставить PHP это делать.

5. Можете ли вы загрузить XML -у меня нет доступа ни к каким файлам docx (пользователь Mac)

Ответ №1:

На самом деле это довольно простой ответ. Все, что вам нужно сделать, это добавить эту строку в readZippedXML() :

 $xmldata = str_replace("</w:p>", "rn", $xmldata);
  

Это потому, что </w: p> — это то, что word использует для обозначения конца абзаца. Например.

 <w:p>This is a paragraph.</w:p>
<w:p>And a second one.</w:p>
  

Комментарии:

1. Я подумал о том же, поэтому я добавил эту строку. Но в итоге он обрывается на полуслове, что действительно плохо для целей моего сайта. ( sandbox.zenorsoft.com/swift /… )

2. @MasterZ попробуйте использовать </w:r> вместо

3. @MasterZ на самом деле, </w:p> это то, что вы ищете. Я отредактирую ответ

4. Вам следует изменить эту среднюю строку ot </w: p> вместо t .

5. Если это не сработает, также добавьте $xmldata = str_replace("<w:br/>", "rn", $xmldata); перед: return strip_tags($xmldata);

Ответ №2:

На самом деле, почему вы не используете OpenXML? Я думаю, что это работает и с PHP. И тогда вам не придется углубляться в подробные сведения о файле xml.

Вот ссылка:
http://openxmldeveloper.org/articles/4606.aspx

Комментарии:

1. Обновил мой ответ ссылкой. По сути, это API от Microsoft для создания и редактирования файлов docx и xlsx.

2. Выглядит интересно, но это может быть больше, чем мне нужно. Мне не нужно редактировать документ или сохранять, мне просто нужно извлечь весь текст. Однако спасибо за информацию.