PHP能获取word页数吗,php - 如何在Linux上获取Word文档中的页数?

我看到这个问题。我还需要确定给定word文件(doc/docx)的页数。我试图调查phplivedocx/zf(@hobodave链接到最初的post答案中),但我在那里失去了手脚。我也不能使用任何外部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格式来说,这无疑是一个挑战,但决不是不可能的。页数存储在文档的“摘要信息”部分,但由于文件的OLE格式,因此很难找到。这个结构被定义得非常彻底(尽管imo很糟糕)here并且更简单。我今天看了一个小时,但没走多远!(不是我习惯的抽象级别),而是输出hex以更好地理解结构:

function get_num_pages_doc($filename)

{

$handle = fopen($filename, 'r');

$line = @fread($handle, filesize($filename));

echo '

';

$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 ''.sprintf('%05X', $line).'0: ';

}

echo strtoupper($string).' ';

if($i == 8)

{

echo ' '.$collection.'
'."\n";

$collection = '';

$i = 0;

$line += 1;

}

}

echo '

';

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$不容易!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值