#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. Выглядит интересно, но это может быть больше, чем мне нужно. Мне не нужно редактировать документ или сохранять, мне просто нужно извлечь весь текст. Однако спасибо за информацию.