Как получить количество страниц в Word Document на Linux?

Я видел этот вопрос. PHP – получить количество страниц в документе Word . Мне также нужно определить количество страниц из данного файла слов (doc / docx). Я пытался исследовать phplivedocx / ZF (@hobodave, связанный с теми, что были в исходных ответах), но я потерял руки и ноги там. Я не могу использовать какой-либо внешний веб-сервис (например, сайты DOC2PDF, а затем подсчитывать страницы в версии PDF или так …).

Просто: есть ли какой-либо PHP-код (используя ZF или что-то еще в PHP, исключая COM-объект или другие исполняемые файлы, такие как AbiWord , я использую общий Linux-сервер без exec или аналогичной функции), чтобы найти количество страниц файла слова?

EDIT: Версии слов, которые будут поддерживаться, – 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 файлов, из-за чего он может найти боль. Структура здесь определена чрезвычайно подробно (хотя и плохо) здесь и проще здесь . Сегодня я посмотрел на это, но не очень далеко! (а не уровень абстракции, к которому я привык), но вывод гексагона для лучшего понимания структуры:

 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 ..Summary 007010: 4900 6E00 6600 6F00 7200 6D00 6100 7400 Informat 007020: 6900 6F00 6E00 0000 0000 0000 0000 0000 ion.......... 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 $ не облегчает!

Взгляните на PhpWord из microsoft codeplex … " http://phpword.codeplex.com/

Это позволит вам открыть и прочитать файл форматированного слова в PHP и выполнить любую необходимую обработку.

Чтобы получить свойства метаданных doc, docx, ppt и pptx, как количество страниц, количество слайдов с использованием PHP i следовали следующему процессу, и это сработало, понравилось обаяние и 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. Благодарю.

Исключая использование Abiword или OpenOffice? Невозможно – количество страниц будет зависеть от количества слов / букв, используемых шрифтов, обоснования и кернинга, размера поля, межстрочного интервала, интервала между абзацами, количества абзацев, столбцов, размера графики / внедренных объектов, разрывов страниц и столбцов и полей страницы ,

Вам нужно что-то, что может понять все это.

Даже если вы используете OpenOffice или Abiword, переплавка текста может изменить количество страниц. Действительно, в некоторых случаях открытие одного и того же документа в другом экземпляре MSWord может привести к разнице.

Лучшее, что вы, вероятно, могли бы решить, было бы статистическим подходом, основанным на представлении документа, но вы все равно увидите огромную дисперсию.