是否有任何方法可以在线(意味着作为上传表单的一部分,因此在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为每个节点获取内容的过程,你可能会有一个轻微的改进,但这仍然会考虑到"某些节点中的不可打印文本"