/**
* pdf 生成首页(某页)缩略图 + 总页数
*
* author shyZhen <huaixiu.zhen@gmail.com>
* https://www.litblc.com
*
* @param $pdf
* @param $tempPdfPath
* @param $isFullPath // 是否是全路径(带有路径+文件名)
* @param int $page 0默认第一页
* @param int $width
* @param int $height
*
* @return array
*
* @throws ImagickException
* @throws \setasign\Fpdi\PdfParser\PdfParserException
*/
public function getPdfPage($pdf, $tempPdfPath, $isFullPath = false, $page = 0, $width = 200, $height = 200)
{
$page = intval($page);
$page = $page >= 0 ? "[{$page}]" : '';
try{
// 解决由于pdf单页分辨率过大,导致无法成功加载的问题
$image3 = new Imagick();
$image3->setResolution(25, 25);
$image3->pingImage($pdf . $page);
$w = $image3->getImageWidth();
$h = $image3->getImageHeight();
if ($w > 3000 || $h > 2000) {
throw new Exception('该PDF文件分辨率过大,无法进行解析');
}
$image3->clear();
$image = new Imagick();
// read 文件之前,需要先设置分辨率
// 设置图片分辨率 由于需要缩略图,此处默认比较小,使用25*25
// https://stackoverflow.com/questions/14033954/set-density-parameter-for-imagick-with-php
// https://stackoverflow.com/questions/9783216/convert-postscript-delegate-failed/23206401#23206401
$image->setResolution(25, 25);
// 使用100的质量生成的文件更小
$image->setcompressionquality(100);
// 读取内容
$image->readImage($pdf . $page);
$image->stripimage();
$image->thumbnailImage($width, $height, true);
if ($isFullPath) {
$result = $tempPdfPath;
} else {
$fileName = self::uuid().'.png';
$result = $tempPdfPath. '/' .$fileName;
}
$image->writeImages($result, false);
$image->clear();
// 读取pdf页数
$image2 = new Imagick();
$image2->setResolution(25, 25);
$image2->pingImage($pdf);
$pageCount = $image2->getNumberImages();
$image2->clear();
// $pageCount = self::$fpdi->setSourceFile($pdf); // fpdi不支持压缩过的pdf
} catch(Exception $e) {
throw new Exception('非法文件', $e->getCode());
}
return [
'url' => $result,
'count' => $pageCount
];
}
调用示例:
/**
* pdf 生成首页(某页)缩略图 + 总页数 使用DEMO
*
* author shyZhen <huaixiu.zhen@gmail.com>
* https://www.litblc.com
*
* @return array
*
* @throws \ImagickException
* @throws \setasign\Fpdi\PdfParser\PdfParserException
*/
public function getPdfPage()
{
$tempPdfPath = '/mnt/hgfs/platform/tempPdf';
$pdf = '/mnt/hgfs/platform/tempPdf/ZHX.pdf';
$tcpdfLoader = TcpdfLoader::getInstance();
$pdfPath = $tcpdfLoader->getPdfPage($pdf, $tempPdfPath);
return $pdfPath;
}
在测试阶段中,发现由于pdf首页分辨率过大导致上传失败,故需要先使用pingImage来验证: