首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空间/pdf到图像获取图像的数量总是返回0

空间/pdf到图像获取图像的数量总是返回0
EN

Stack Overflow用户
提问于 2019-01-10 17:50:20
回答 1查看 2.8K关注 0票数 1

我使用空间/pdf-图像与laravel创建上传的pdf文件的缩略图。奇怪的是,这段代码曾经工作过,但现在没有了。不管pdf包含多少页,$pdf->getNumberOfPages();总是返回0

这是Spatie类中的构造函数。如您所见,它只是使用imagick的getNumberImages();

代码语言:javascript
复制
public function __construct($pdfFile)
{
    if (! filter_var($pdfFile, FILTER_VALIDATE_URL) && ! file_exists($pdfFile)) {
        throw new PdfDoesNotExist();
    }
    $this->imagick = new Imagick($pdfFile);
    $this->numberOfPages = $this->imagick->getNumberImages();
    $this->pdfFile = $pdfFile;
}

这是我的控制器的简化版本:

代码语言:javascript
复制
   public function uploadDocument(Request $request) {

       $doc = $request->file('document');

       $pdf = new \Spatie\PdfToImage\Pdf($doc);

       $pages = $pdf->getNumberOfPages();
       dd($pdf);

转储的输出是:

代码语言:javascript
复制
    Pdf {#315 ▼
      #pdfFile: UploadedFile {#236 ▶}
      #resolution: 144
      #outputFormat: "jpg"
      #page: 1
      +imagick: Imagick {#407}
      #numberOfPages: 0
      #validOutputFormats: array:3 [▼
          0 => "jpg"
          1 => "jpeg"
          2 => "png"
      ]
      #layerMethod: 14
      #colorspace: null
      #compressionQuality: null
   }

我知道一个事实,这是在一点上,我倾向于想象作为罪魁祸首。没有错误也没有例外。有什么简单的方法来检验这个理论吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-03 15:52:03

我知道这很古老,但我想我发现了这个问题。我遇到了同样的问题,但只有当我是照明\Http\UploadedFile的实例时,才会发生这种情况。

为了解决这个问题,我实际上必须将文件保存到本地磁盘(不是S3或任何其他远程磁盘),然后操作保存的PDF。工作得很好!

下面是我的代码示例(注意:由于应用程序中的业务规则,我手动循环。

代码语言:javascript
复制
     * generates a PNG preview from a PDF file
     * @param UploadedFile $file  PDF file to be converted
     * @param $historyID integer asset_file_history_id
     * @return bool whether or not the preview was successfully created
     */
    function generatePreviewImage(UploadedFile $file,$historyID)
    {

        $file =  storage_path('app/'.$file->store('temp'));
        try {
            $pdf = new Pdf($file);
            $pdf->setCompressionQuality(85);
            $pdf->setOutputFormat('png');
            $pdf->setColorspace(1);
            $pageLimit = $pdf->getNumberOfPages() > 10 ? 10: $pdf->getNumberOfPages();
             if($pdf->getNumberOfPages() >1) {
                //using if to account for possible count of 0, rather than just relying on the loop
                for ($i = 1; $i <=$pageLimit; $i++) {
                    $name = md5(time()) . ".png";
                    $tempPath = sys_get_temp_dir() . "/" . $name;
                    //
                    $pdf->setPage($i)
                        ->saveImage($tempPath);
                    //
                    Storage::disk('s3')->put("/preview/{$name}", file_get_contents($tempPath), 'public');

                    $page = new PreviewImagePage();
                    $page->url = "preview/{$name}";
                    $page->asset_file_history_id = $historyID;
                    $page->save();

                }//loop through the pages
            }//if
            else
            {
                $name = md5(time()) . ".png";
                $tempPath = sys_get_temp_dir() . "/" . $name;
                //
                $pdf->saveImage($tempPath);
                //
                Storage::disk('s3')->put("/preview/{$name}", file_get_contents($tempPath), 'public');

                $page = new PreviewImagePage();
                $page->url = "preview/{$name}";
                $page->asset_file_history_id = $historyID;
                $page->save();

            }//else
}
        catch(\Exception $e)
        {
            dd($e);
           // return false;
        }

然后,当然,返回并清理任何不需要保存的文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54134324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档