PDF 文件是否可以定义 0 页或以其他方式导致页面大小为 0?
Can a PDF file have 0 pages defined or otherwise result in 0 as page size?
我有一个使用 Imagick 的 PHP 脚本,但是如果用户提供的 PDF 文件不包含页面或页面没有高度或宽度,则存在 NAN 错误的风险。我不确定这在 PDF 结构中是否可行。从大于总页数的页码制作 jpeg 也会导致错误。通常是否可以发送有效的 PDF 文件包装器但没有实际页面内容?
核心问题:在进入从 PDF 到 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');
当然,PDF 文件是一种容器格式,几乎可以包含任何内容,包括(仅)具有 0 页的元数据。但即使如此,使用此代码也很有可能在仅包含 5 页的文档上请求第 21 页的缩略图。
如果发生这种情况,问题将出现在这一行:
$img = new Imagick($src."[$page]");
如果提供的页面不存在,这将引发异常。您可以捕获该异常并根据需要进行处理:
try {
$img = new Imagick($src."[$page]");
} catch (ImagickException $error) {
return false;
}
如果想预先读取页数,可以尝试让Imagick先解析文档:
$pdf = new Imagick($src);
$pages = $pdf->getNumberImages();
The function name is a bit misleading, see this comment in the PHP manual:
"For PDFs this function indicates the number of pages on the PDF, NOT images that might be embedded within the PDF."
同样,如果 PDF 文档在某种程度上无效,这会引发异常,因此您可能想要捕获并处理它:
try {
$pdf = new Imagick($src);
$pages = $pdf->getNumberImages();
} catch (ImagickException $error) {
return false;
}
if ($pages < $page) {
return false;
}
PDF 需要在其页面树中至少包含一页,因此您不能拥有有效的零页 PDF。如果您有这样的 PDF,并且您的 PDF 软件将其读取为有效 并且 报告了它的零页,那么该软件就会产生误导。
在这种情况下,如果我没记错的话,Acrobat 会显示一个带有错误消息的对话框,我想大多数其他 PDF 软件也会有类似的抱怨。
PDF 的页面边界由矩形定义,矩形本身没有限制,我可以在规范中找到关于不允许零宽度 and/or 高度的限制。虽然实际上说拥有它会很奇怪,而且大多数 PDF 软件可能会抱怨它或被它绊倒。
您当然可以拥有一个没有内容的 PDF 页面,例如一个空白的 8.5x11" 页面是完全有效的。如果您愿意,您可以在页面上使用那个或一些 text/image 来指示用户发生错误。
我有一个使用 Imagick 的 PHP 脚本,但是如果用户提供的 PDF 文件不包含页面或页面没有高度或宽度,则存在 NAN 错误的风险。我不确定这在 PDF 结构中是否可行。从大于总页数的页码制作 jpeg 也会导致错误。通常是否可以发送有效的 PDF 文件包装器但没有实际页面内容?
核心问题:在进入从 PDF 到 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');
当然,PDF 文件是一种容器格式,几乎可以包含任何内容,包括(仅)具有 0 页的元数据。但即使如此,使用此代码也很有可能在仅包含 5 页的文档上请求第 21 页的缩略图。
如果发生这种情况,问题将出现在这一行:
$img = new Imagick($src."[$page]");
如果提供的页面不存在,这将引发异常。您可以捕获该异常并根据需要进行处理:
try {
$img = new Imagick($src."[$page]");
} catch (ImagickException $error) {
return false;
}
如果想预先读取页数,可以尝试让Imagick先解析文档:
$pdf = new Imagick($src);
$pages = $pdf->getNumberImages();
The function name is a bit misleading, see this comment in the PHP manual:
"For PDFs this function indicates the number of pages on the PDF, NOT images that might be embedded within the PDF."
同样,如果 PDF 文档在某种程度上无效,这会引发异常,因此您可能想要捕获并处理它:
try {
$pdf = new Imagick($src);
$pages = $pdf->getNumberImages();
} catch (ImagickException $error) {
return false;
}
if ($pages < $page) {
return false;
}
PDF 需要在其页面树中至少包含一页,因此您不能拥有有效的零页 PDF。如果您有这样的 PDF,并且您的 PDF 软件将其读取为有效 并且 报告了它的零页,那么该软件就会产生误导。
在这种情况下,如果我没记错的话,Acrobat 会显示一个带有错误消息的对话框,我想大多数其他 PDF 软件也会有类似的抱怨。
PDF 的页面边界由矩形定义,矩形本身没有限制,我可以在规范中找到关于不允许零宽度 and/or 高度的限制。虽然实际上说拥有它会很奇怪,而且大多数 PDF 软件可能会抱怨它或被它绊倒。
您当然可以拥有一个没有内容的 PDF 页面,例如一个空白的 8.5x11" 页面是完全有效的。如果您愿意,您可以在页面上使用那个或一些 text/image 来指示用户发生错误。