我正在与PHP ImageMagick Library合作,将上传的pdf文件转换为单一的png文件,这样我就可以在我的Laravel网页上将pdf显示为单一的图像.到目前为止,我可以使用以下代码将整个pdf转换为单个图像:

<?php
  $imagick = new Imagick();
  $file = new File;
  // other lines of code
  // ...
  $imgPath = Storage::path($file->file_path);
  $imgSavePath = Storage::path('uploads/buffer/'.Str::beforeLast($file->name, '.').'.png');
  $imagick->readImage($imgPath);
  $imagick->resetIterator();
  $imagick = $imagick->appendImages(true);
  $imagick->writeImages($imgSavePath, true);

这是通过生成单个PNG图像实现的.然而,我发现这是资源密集型的(存储方面的)和耗时的,因为我是通过一个AJAX调用来交付功能的.

我希望我的网络应用程序转换只有前n页的pdf(说前5页)为一个单一的图像,作为网站上的预览-此后,用户可以下载整个pdf查看他们的本地系统.无论上传的pdf文档的页数是多少,该功能都应该有效.

到目前为止,我只在documentation中发现可以从Imagick对象读取特定索引处的页面并使用以下命令转换为图像:

...
$imgPath = Storage::path($file->file_path);
$index = 5;
$imagick->readImage($imgPath. '[' . $index . ']');

然而,我发现很难重构它,这样应用程序就可以读取前n页.

推荐答案

直观地说,readImage()函数的工作方式似乎与命令行语法类似.感谢@MarkSetchell在 comments 中的提示:

<?php
  $imagick = new Imagick();
  $file = new File;
  // other lines of code
  // ...
  $imgPath = Storage::path($file->file_path);
  $imgSavePath = Storage::path('uploads/buffer/'.Str::beforeLast($file->name, '.').'.png');
  $imagick->readImage($imgPath.'[0-4]'); // read only the first 5 pages
  $imagick->resetIterator();
  $imagick = $imagick->appendImages(true);
  $imagick->writeImages($imgSavePath, true); 

我用的是ImageMagick 6.9.10-68PHP 8.1.12

Php相关问答推荐

WordPress:将自定义单选输入字段添加到用户配置文件

以编程方式更新现有Yith WooCommerce Booking的状态

显示WooCommerce当前产品类别或标签的短代码

Msgraph-sdk-php v2如何从返回对象中获取数据?

从WC会话变量更改WooCommerce checkout 托运方法成本

当主页和帖子的缩略图相同时,如何减少主页和帖子的缩略图

有没有可能从composer 过时的输出中隐藏不需要的主要版本?

使用PHP编码的字符串与使用OpenSSL编写的shell 代码之间的差异

如何使用索引加速和优化MySQL搜索

fpm-php + nginx + POST数据

Mockery在模拟Redis连接时抛出错误:Mockery\Exception\BadMethodCallException

无法在 WordPress 上获取 JSON 数据

使用帖子 ID 更新 wp 帖子

WooCommerce:如果购物车中已存在产品,则增加购物车商品数量

需要以一种形式执行两个操作

订单完成后创建 WooCommerce 促销代码

当所有对象都属于同一类型时,我可以省略 PHP in_array() 中的 strict 参数吗?

WooCommerce checkout 流程中基于所选选项添加自定义费用

为什么可以从 PHP 类访问 PHP Trait 的私有成员?

升级到 PHP 8.2:ksort 和 krsort 更改