Поиск разрывов строк в файле docx с использованием PHP - PullRequest
4 голосов
/ 10 апреля 2011

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

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

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

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

    $Data = str_replace("<", "&lt;", $Data);
    $Data = str_replace(">", "&gt;", $Data);

    $Breaks = array("\r\n", "\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>", "\r\n", $xmldata);
            // Return data without XML formatting tags
            return strip_tags($xmldata);
        }

        $zip->close();
    }

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

Ответы [ 2 ]

9 голосов
/ 13 апреля 2011

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

$xmldata = str_replace("</w:p>", "\r\n", $xmldata);

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

<w:p>This is a paragraph.</w:p>
<w:p>And a second one.</w:p>
0 голосов
/ 13 апреля 2011

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

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

...