Как посчитать символы с пробелами в файлах docx / odt (rtf)?

Есть ли способ, как онлайн (то есть как часть формы загрузки, так в php / javasctipt) получить количество символов с пробелами в документе, сохраненном в DOCX и ODT (и RTF, если это возможно)? Я имею в виду, чтобы получить такое же количество символов, как показано в статистике слов?

Я знаю, это слово сохранило <characters> в его app.xml файл, но это не точно и, вероятно, без пробелов или я не знаю хорошо.

Я пытался сделать это просто — откройте xmls, посчитайте символы и получите его значение, но проблема в том, что этот путь не является ни точным, смотрите мой код:

$document = 'cvicnytext2.docx';

function extracttext($filename) {
//Check for extension
$ext = explode(".", $filename);
$ext = end($ext);

//if its docx file
if($ext == 'docx')
$dataFile = "word/document.xml";
else
$dataFile = "content.xml";

$zip = new ZipArchive;

// Open the archive file
if (true === $zip->open($filename)) {
if (($index = $zip->locateName($dataFile)) !== false) {
$text = $zip->getFromIndex($index);
$xml = new DOMDocument();
$xml->loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
return strip_tags($xml->saveXML());
}
$zip->close();
}
return "File not found";
}

$length = strlen( utf8_decode( extracttext($document) ) );
echo "Length: ". $length."(chars with spaces).";

Если я загружу, например, это файл Я получаю по своему коду 76015 символы, но слово показывает 76113 так что сотня пропала где-то.

У кого-нибудь есть идеи, как это уточнить? Ваша помощь будет оценена.

Еще немного ОБНОВЛЕНИЙ

Я обнаружил, что нет большой разницы в:
используемые функции для подсчета длины — mb_strlen( $text ) а также strlen( utf8_decode( $text ))

Но что, вероятно, вызывает проблему, так это то, что чтение zip-файла вызывает некоторые проблемы — добавьте пробел до и после строки и добавьте некоторые символы, которые не печатаются, но они учитываются. Любая идея? Если я копирую / вставляю тот же текст непосредственно в функции подсчета, он работает без проблем …

2

Решение

Я считаю, что ваш подход в основном единственный доступный, если вы не хотите вдаваться в подробности стандарта ODF или OOXML.

Для точного подсчета вам сначала необходимо удалить узлы, которые «не напечатаны», но могут содержать некоторый текст, например, заголовки и описания изображений и объектов, …

У вас может быть небольшое улучшение, если вы напишите рекурсивную функцию, которая выполняет процесс получения контента для каждого узла через nodeValue, и вы обрежете результат, но при этом все равно будет учитываться «непечатный текст в некоторых узлах».

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector