PDF文件是否可以定义0页,否则会导致0作为页面大小?

问题描述 投票:0回答:2

我有一个使用Imagick的PHP脚本,但如果用户提供的PDF文件不包含任何页面或者页面没有高度或没有宽度,则存在NAN错误的风险。我不确定这是否可以在PDF结构中使用。同时使页码大于总页数的jpeg将导致错误。通常是否可以发送有效的PDF文件包装但没有实际的页面内容?

The core question: How can we count and measure pages for a proper error capture before entering the conversion from PDF to JPEG?

在下面的函数中,我假设可能有0高度或0宽度。并使用代码if($ 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');
php pdf imagick
2个回答
0
投票

当然,PDF文件是一种容器格式,可以包含几乎任何东西,包括(仅)0页的元数据。但即便如此,使用此代码,很有可能在仅包含5个页面的文档上请求第21页的缩略图。

如果发生这种情况,问题将出现在这一行:

$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手册中的this comment

“对于PDF,此功能指示PDF上的页面数量,而不是可能嵌入PDF中的图像。”

在这里,如果PDF文档在某种程度上无效,这可能会引发异常,因此您可能希望捕获并处理它:

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

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

0
投票

PDF需要在其页面树中包含至少一个页面,因此您不能拥有有效的零页PDF。如果您有这样的PDF并且您的PDF软件将其视为有效并且报告了零页面,那么该软件将会产生误导。

如果我正确地回忆起来,Acrobat将在这种情况下显示一个带有错误消息的对话框,我想大多数其他PDF软件同样会抱怨。

PDF的页面边界由矩形定义,它本身没有限制,我可以在规范中找到关于不允许零宽度和/或高度的限制。虽然实际上说拥有它并且可能大多数PDF软件会抱怨它或绊倒它会很奇怪。

您当然可以拥有一个没有内容的PDF页面,例如一个空白的8.5x11“页面是完全有效的。您可以使用该页面或页面上的某些文本/图像,表明如果您愿意,用户可能会发生错误。

© www.soinside.com 2019 - 2024. All rights reserved.