Мой PHP-скрипт успешно читает весь текст из файла .docx, но я не могу понять, где разрыв строки должен быть таким, чтобы текст сжимался и трудно читался (один огромный абзац). Я вручную просмотрел все файлы XML, чтобы попытаться понять это, но я не могу понять это.
Вот функции, которые я использую для извлечения данных файла и возврата обычного текста.
public function read($FilePath) { // Save name of the file parent::SetDocName($FilePath); $Data = $this->docx2text($FilePath); $Data = str_replace("<", "<", $Data); $Data = str_replace(">", ">", $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 ""; }
На самом деле это довольно простой ответ. Все, что вам нужно сделать, это добавить эту строку в 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>
На самом деле, почему вы не используете OpenXML? Я думаю, что это работает и с PHP. И тогда вам не нужно спускаться в подробные детали XML-файла.
Вот ссылка:
http://openxmldeveloper.org/articles/4606.aspx