为了账号安全,请及时绑定邮箱和手机立即绑定

PDF文件是否可以定义0页,否则页面大小等于0吗?

PDF文件是否可以定义0页,否则页面大小等于0吗?

PHP
料青山看我应如是 2021-05-14 14:13:57
我有一个使用Imagick的PHP脚本,但是如果用户提供的PDF文件不包含页面或页面没有高度或宽度,则存在NAN错误的风险。我不确定在PDF结构中是否可行。同样,使用大于总页数的jpeg创建jpeg也会导致错误。通常是否可以发送有效的PDF文件包装但没有实际的页面内容?核心问题:在进入从PDF到JPEG的转换之前,我们如何计数和测量页面以捕获正确的错误?在下面的函数中,我假设可能有0个高度或0个宽度。并使用代码if($ imH == 0){$ imH = 1;},但是基于假设的代码感觉不对。该功能的某些部分来自umidjons的文章:https ://gist.github.com/umidjons/11037635PHP代码: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');调用该函数,例如:$newthumb = genPdfThumbnail('/nfs/vsp/server/u/user/public_html/any.pdf','thumbs/any.p01.jpg',150,'01');
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

当然,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手册中的以下注释:


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


同样,在这里,如果PDF文档在某种程度上无效,则可能引发异常,因此您可能想捕获并处理该异常:


try {

    $pdf = new Imagick($src);

    $pages = $pdf->getNumberImages();

} except (ImagickException $error) {

    return false;

}


if ($pages < $page) {

    return false;

}


查看完整回答
反对 回复 2021-05-21
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

PDF必须在其“页面树”中至少包含一页,因此您不能拥有有效的零页面PDF。如果您有这样的PDF,并且您的PDF软件将其视为有效文件报告了零页,那么该软件将极具误导性。

如果我没有记错的话,在这种情况下,Acrobat会显示一个对话框,并显示一条错误消息,并且我想大多数其他PDF软件也会同样抱怨。

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

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


查看完整回答
反对 回复 2021-05-21
  • 2 回答
  • 0 关注
  • 260 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信