Может ли файл PDF иметь 0 страниц, заданных или иным образом привести к 0 в качестве размера страницы? - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть PHP-скрипт, использующий Imagick, но есть риск ошибки NAN, если предоставленный пользователем файл PDF не содержит страниц или имеет страницу без высоты или ширины.Я не уверен, возможно ли это в структуре PDF.Также создание jpeg из номера страницы, большего, чем общее количество страниц, приведет к ошибке.Возможно ли, как правило, отправлять действительную оболочку PDF-файла, но без фактического содержимого страницы?

Основной вопрос: как мы можем подсчитать и измерить страницы для правильного захвата ошибок перед вводом преобразования из PDF в JPEG?

В приведенной ниже функции я предполагаю, что возможно иметь 0 высоту или 0 ширину.И используйте код, если ($ imH == 0) {$ imH = 1;}, но код, основанный на предположении, не выглядит правильным.

части функции были взяты из статьи umidjons:https://gist.github.com/umidjons/11037635

Код PHP:

function genPdfThumbnail ( $src, $targ, $size=256, $page=1 ){

    if(file_exists($src) && !is_dir($src)): // source path must be available and cannot be a directory

        if(mime_content_type($src) != 'application/pdf'){return FALSE;} // source is not a pdf file returns a failure

        $sepa   =   '/'; // using '/' as path separation for nfs on linux.
        $targ   =   dirname($src).$sepa.$targ;
        $size   =   intval($size); // only use as integer, default is 256
        $page   =   intval($page); // only use as integer, default is 1     
        $page--; // default page 1, must be treated as 0 hereafter
        if ($page<0){$page=0;} // we cannot have negative values

        $img    =   new Imagick($src."[$page]");
        $imH    =   $img->getImageHeight();
        $imW    =   $img->getImageWidth();

        if ($imH==0) {$imH=1;} // if the pdf page has no height use 1 instead
        if ($imW==0) {$imW=1;} // if the pdf page has no width use 1 instead
        $sizR   =   round($size*(min($imW,$imH)/max($imW,$imH))); // relative pixels of the shorter side

        $img    ->  setImageColorspace(255); // prevent image colors from inverting
        $img    ->  setImageBackgroundColor('white'); // set background color before flatten
        $img    =   $img->flattenImages(); // prevent black zones on transparency in pdf
        $img    ->  setimageformat('jpeg');

        if ($imH == $imW){$img->thumbnailimage($size,$size);} // square page 
        if ($imH < $imW) {$img->thumbnailimage($size,$sizR);} // landscape page orientation
        if ($imH > $imW) {$img->thumbnailimage($sizR,$size);} // portrait page orientation      
        if(!is_dir(dirname($targ))){mkdir(dirname($targ),0777,true);} // if not there make target directory

        $img    ->  writeimage($targ);
        $img    ->  clear();
        $img    ->  destroy();

        if(file_exists( $targ )){ return $targ; } // return the path to the new file for further processing

    endif;
    return FALSE; // source file not available or Imagick didn't create jpeg file, returns a failure

}

вызовите функцию, например:

$newthumb = genPdfThumbnail('/nfs/vsp/server/u/user/public_html/any.pdf','thumbs/any.p01.jpg',150,'01');

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

PDF-файл должен содержать хотя бы одну страницу в своем дереве страниц, чтобы у вас не было действительного PDF-файла с нулевой страницей. Если у вас есть такой PDF-файл, а ваше программное обеспечение PDF считывает его действительным , а сообщает о нулевых страницах, то это программное обеспечение может вводить в заблуждение.

В таком случае Acrobat отобразит диалоговое окно с сообщением об ошибке, если я правильно запомнил, и предположил бы, что большинство других программ PDF также будут жаловаться.

Границы страницы PDF определяются прямоугольниками, которые сами по себе не имеют ограничений, которые я могу найти в спецификации о недопустимости нулевой ширины и / или высоты. Хотя, на самом деле, было бы странно иметь его, и, вероятно, большинство программ PDF будут жаловаться на это или спотыкаться об этом.

Вы, безусловно, можете иметь страницу в формате PDF без содержимого, например, пустая страница размером 8,5х11 дюймов вполне допустима. Вы можете использовать это или, возможно, какой-нибудь текст / изображение на странице, указывающее, что ваша ошибка произошла с пользователем, если хотите.

0 голосов
/ 28 апреля 2019

Конечно, PDF-файл - это контейнерный формат, который может содержать почти все, включая (только) метаданные с 0 страницами.Но даже в этом случае с помощью этого кода вполне возможно запросить миниатюру для страницы 21 в документе, который содержит только 5 страниц.

Если это произойдет, проблема возникнет в этой строке:

$img    =   new Imagick($src."[$page]");

Это вызовет исключение, если предоставленная страница не существует.Вы можете перехватить это исключение и обработать его по своему усмотрению:

try {
    $img = new Imagick($src."[$page]");
} except (ImagickException $error) {
    return false;
}

Если вы хотите заранее прочитать количество страниц, вы можете попытаться позволить Imagick сначала проанализировать документ:

$pdf = new Imagick($src);
$pages = $pdf->getNumberImages();

Имя функции немного вводит в заблуждение, см. этот комментарий в руководстве по PHP:

"Для PDF-файлов эта функция указывает количество страниц в PDF,НЕ изображения, которые могут быть встроены в PDF. "

Здесь также, если PDF-документ каким-то образом недействителен, это может вызвать исключение, поэтому вы можете захотеть поймать это исправиться с этим:

try {
    $pdf = new Imagick($src);
    $pages = $pdf->getNumberImages();
} except (ImagickException $error) {
    return false;
}

if ($pages < $page) {
    return false;
}
...