【问题标题】:How to count characters with spaces in docx/odt(rtf) files?如何计算 docx/odt(rtf) 文件中带空格的字符?
【发布时间】:2015-06-05 21:23:19
【问题描述】:

有什么方法可以在线(意味着作为上传表单的一部分,因此在 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).";

例如,如果我上传 file 我的代码 76015 字符,但 Word 显示 76113 所以某处丢失了一百个。

有人知道如何使它更精确吗?我们将不胜感激。

更多更新

我发现在以下方面没有太大区别: 用于计算长度的函数 - mb_strlen( $text )strlen( utf8_decode( $text ))

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

【问题讨论】:

    标签: php character rtf docx odt


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多