我看到了这个问题,PHP -获取Word文档中的页数。我还需要确定给定word文件(doc/docx)中的页面数。我试图调查phplivedocx/ZF (@hobodave链接到最初的帖子答案),但我在那里失去了手脚。我也不能使用任何外部web服务(比如DOC2PDF站点,然后计算PDF版本中的页面,或者……)。
简单地说:是否有任何PHP代码(在php中使用ZF或其他任何东西,不包括COM对象或其他执行文件,例如“AbiWord”;我使用共享的Linux服务器,没有exec
或类似的功能)来查找word文件的页数?
编辑:即将被支持的单词版本是Microsoft 2003 & 2007。
发布于 2012-02-01 21:01:44
获取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)
这将使您找到相关的部分代码,打开它并获得页码。当然,这是我没有时间去做的困难之处,但应该让你朝着正确的方向前进。
别让这件事变得容易!
发布于 2012-02-03 02:09:24
看看microsoft中的PhpWord . "http://phpword.codeplex.com/
它将允许您在PHP中打开和读取格式化文件,并执行所需的任何处理。
发布于 2014-04-11 12:55:26
要获得文档、docx、ppt和pptx的元数据属性(如页数),使用PHP的幻灯片数量遵循以下过程,它非常喜欢魅力和iam,下面是我所遵循的过程,希望它能帮助到某人
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脚本中执行这个逗号。谢谢。
https://stackoverflow.com/questions/8986067
复制相似问题