如何在docx/odt(rtf)文件中计算带有空格的字符


How to count characters with spaces in docx/odt(rtf) files?

是否有任何方法可以在线(意味着作为上传表单的一部分,因此在php/javascript中)获得保存在DOCX和ODT(如果可能的话,还有RTF)中的文档的空格的字符数?我的意思是,获得与word统计中显示的相同的字符计数?

我知道,这个单词已经将<characters>存储在他的app.xml文件中,但这并不精确,可能没有空格或者我不太清楚。

我试着做它简单-打开xml,计数字符,并得到它的值,但问题是,这种方式既不准确,见我的代码:

$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字符,但Word显示76113,所以100个丢失的地方。

有没有人知道如何使它更精确?非常感谢您的帮助。

更多更新

我发现在:用于计算长度的函数- mb_strlen( $text )strlen( utf8_decode( $text ))

但是可能导致问题的原因是读取zip文件会导致一些麻烦-在字符串之前和之后添加空间,并添加一些不打印但计数的字符。任何想法?如果我复制/传递相同的文本直接到计数函数,它工作没有问题…

我相信,如果您不想深入了解ODF或OOXML标准的细节,那么您的方法基本上是唯一可用的方法。

要获得准确的计数,首先需要删除"未打印"但可能包含一些文本的节点,例如,图像和对象的标题和描述,…

如果你写一个递归函数,通过nodeValue为每个节点获取内容的过程,你可能会有一个轻微的改进,但这仍然会考虑到"某些节点中的不可打印文本"