2

有什么方法可以在线(意思是作为上传表单的一部分,所以在 php/javasctipt 中)获取 DOCX 和 ODT 中保存的文档空格的字符数(如果可能,还有 RTF)?我的意思是,要获得与 Words 统计信息中显示的相同的字符数?

我知道,那个词已经存储<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字符得到,但 Word 显示76113有一百个在某处丢失。

有谁知道如何使它更精确?您的帮助将不胜感激。

更多更新

我发现其中没有太大区别:用于计算长度的函数 -mb_strlen( $text )strlen( utf8_decode( $text ))

但可能导致问题的原因是读取 zip 文件会导致一些麻烦 - 在字符串前后添加空格并添加一些未打印但被计算在内的字符。任何想法?如果我将相同的文本直接复制/粘贴到计数功能中,它可以毫无问题地工作......

4

1 回答 1

0

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

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

如果您编写一个递归函数,该函数通过 nodeValue 为每个节点获取内容并修剪结果,但仍会考虑“某些节点中的不可打印文本”,您可能会有轻微的改进

于 2015-06-14T12:41:50.660 回答