如何在linux上获取Word文档的页数


How to get the number of pages in a Word Document on linux?

我看到了这个问题PHP-获取Word文档中的页数。我还需要从给定的word文件(doc/docx)中确定页数。我试图调查phplivedocx/ZF(@hobodave链接到原始帖子中的答案),但我在那里失去了双手和双腿。我也不能使用任何外部web服务(比如DOC2PDF网站,然后计算PDF版本中的页面,等等…)

简单地说:是否有任何php代码(使用ZF或php中的任何其他代码,不包括COM对象或其他执行文件,如"AbiWord";我使用的是共享Linux服务器,没有exec或类似功能)来查找word文件的页数?

编辑:即将支持的word版本是Microsoft word 2003&2007年

获取docx文件的页数非常容易:

function get_num_pages_docx($filename)
{
    $zip = new ZipArchive();
    if($zip->open($filename) === true)
    {  
        if(($index = $zip->locateName('docProps/app.xml')) !== false)
        {
            $data = $zip->getFromIndex($index);
            $zip->close();
            $xml = new SimpleXMLElement($data);
            return $xml->Pages;
        }
        $zip->close();
    }
    return false;
}

对于97-2003格式来说,这当然很有挑战性,但绝非不可能。页数存储在文档的SummaryInformation部分,但由于文件的OLE格式,查找起来很困难。这里对结构的定义非常彻底(尽管imo很糟糕),这里更简单。我今天看了一个小时,但没有走多远!(不是我习惯的抽象级别),但输出十六进制以更好地理解结构:

function get_num_pages_doc($filename) 
{
    $handle = fopen($filename, 'r');
    $line = @fread($handle, filesize($filename));
    echo '<div style="font-family: courier new;">';
        $hex = bin2hex($line);
        $hex_array = str_split($hex, 4);
        $i = 0;
        $line = 0;
        $collection = '';
        foreach($hex_array as $key => $string)
        {
            $collection .= hex_ascii($string);
            $i++;
            if($i == 1)
            {
                echo '<b>'.sprintf('%05X', $line).'0:</b> ';
            }
            echo strtoupper($string).' ';
            if($i == 8)
            {
                echo ' '.$collection.' <br />'."'n";
                $collection = '';
                $i = 0;
                $line += 1;
            }
        }
    echo '</div>';
    exit();
}
function hex_ascii($string, $html_safe = true)
{
    $return = '';
    $conv = array($string);
    if(strlen($string) > 2)
    {
        $conv = str_split($string, 2);
    }
    foreach($conv as $string)
    {
        $num = hexdec($string);
        $ascii = '.';
        if($num > 32)
        {   
            $ascii = unichr($num);
        }
        if($html_safe AND ($num == 62 OR $num == 60))
        {
            $return .= htmlentities($ascii);
        }
        else
        {
            $return .= $ascii;
        }
    }
    return $return;
}
function unichr($intval)
{
    return mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE');
}

它将把代码放在你可以找到的部分,例如:

007000: 0500 5300 7500 6D00 6D00 6100 7200 7900 ..S.u.m.m.a.r.y.
007010: 4900 6E00 6600 6F00 7200 6D00 6100 7400 I.n.f.o.r.m.a.t.
007020: 6900 6F00 6E00 0000 0000 0000 0000 0000 i.o.n...........
007030: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 

这将允许您查看参考信息,例如:

007040: 2800 0201 FFFF FFFF FFFF FFFF FFFF FFFF (...ÿÿÿÿÿÿÿÿÿÿÿÿ
007050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
007060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
007070: 0000 0000 2500 0000 0010 0000 0000 0000 ....%...........

这将允许您确定所描述的属性:

_ab = ("SummaryInformation") 
_cb = 0028
_mse = 02 (STGTY_STREAM) 
_bflags = 01 (DE_BLACK) 
_sidLeftSib = FFFF FFFF 
_sidRightSib = FFFF FFFF (none) 
_sidChild = FFFF FFFF (n/a for STGTY_STREAM) 
_clsid = 0000 0000 0000 0000 0000 0000 0000 0000 (n/a) 
_dwUserFlags = 0000 0000 (n/a) 
_time[0] = CreateTime = 0000 0000 0000 0000 (n/a) 
_time[1] = ModifyTime = 0000 0000 0000 0000 (n/a)
_startSect = 0000 0000 
_ulSize = 0000 1000 
_dptPropType = 0000 (n/a)

它可以让你找到相关的代码部分,打开它并获得页码。当然,这是我没有时间处理的困难,但应该会让你朝着正确的方向前进。

M$不要让它变得容易!

看看微软codeplex的PhpWord。。。"http://phpword.codeplex.com/

它将允许您在PHP中打开和读取单词格式的文件,并执行您需要的任何处理。

要使用PHP获取doc、docx、ppt和pptx的元数据属性,如页数、幻灯片数量,我遵循了以下过程,它很有魅力,我很高兴,下面是我遵循的过程,希望它能帮助

Download and configure Apache Tika.

完成后,您可以尝试执行以下命令,它将提供有关文件的所有元数据

java -jar tika-app-1.5.jar -m test.docx
java -jar tika-app-1.5.jar -m test.doc
java -jar tika-app-1.5.jar -m test.pptx
java -jar tika-app-1.5.jar -m test.ppt

经过测试,您可以在PHP脚本中执行此命令。谢谢

是否排除使用Abiword或OpenOffice?不可能-页数将取决于单词/字母的数量、使用的字体、对齐和紧排、页边距大小、行距、段落间距、段落数量、列、图形/嵌入对象的大小、分页符/分栏符和页边距。

你需要一些能够理解所有这些的东西。

即使您使用OpenOffice或Abiword,重新折叠文本也可能会更改页数。事实上,在某些情况下,在MSWord的不同实例上打开同一文档可能会导致差异。

你可能能管理的最好的方法是基于文档表示的统计方法,但你仍然会看到巨大的差异。