imagick 操作 pdf 生成首页(某页)缩略图 + 总页数

in 日常随笔 with 0 comment 访问: 890 次

imagick 操作 pdf 生成首页(某页)缩略图 + 总页数

   /**
     * 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来验证:

e774df6d8a22ff16a2af165ea2bd5fd.png

31f8b79333e983c3d663d83abb02771.png

赞赏支持
Responses