Как узнать количество страниц в документе Word на Linux? - PullRequest
10 голосов
/ 24 января 2012

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

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

РЕДАКТИРОВАТЬ: Версии Word, которые должны быть поддержаны, Microsoft-Word 2003 и 2007.

Ответы [ 4 ]

19 голосов
/ 02 февраля 2012

Получить количество страниц для файлов 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 $ не облегчает задачу!

3 голосов
/ 03 февраля 2012

Посмотрите на PhpWord из Microsoft CodePlex ... "http://phpword.codeplex.com/

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

2 голосов
/ 11 апреля 2014

Чтобы получить метаданные о свойствах doc, docx, ppt и pptx, таких как количество страниц, количество слайдов с использованием PHP, я следовал следующему процессу, и это сработало так, как мне нравится, и я очень рад, ниже приведен процесс, которым я следовал, надеюсь, этопомогает кому-то

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-скрипте,Спасибо.

0 голосов
/ 27 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...