【问题标题】:imagick converting pdf to jpg throws an errorimagick 将 pdf 转换为 jpg 会引发错误
【发布时间】:2014-07-03 19:13:23
【问题描述】:
for ($i = 0; $i < $int; $i++) {
    $im = new imagick();
    // $im->readimage($soubory."[".$i."]");
    $im->setResolution(300, 300);
    $im->readImage($soubory . "[" . $i . "]");
    $im->resampleImage(150, 150, imagick::FILTER_UNDEFINED, 1);
    $im->resizeImage(512, 700, Imagick::FILTER_LANCZOS, 0);
    $im->setImageFormat('jpeg');
    $im->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH);
    $im->setImageFormat('jpg');
    $i = sprintf("%03s", $i);
    $im->writeImage('../pdf/publisher/' . $select . '/x-' . $i . '.jpg');
    $im->clear();
    $im->destroy();

    if ($i == 000) {
        $preview = '../pdf/publisher/' . $select . '/x-' . $i . '.jpg';
    }
}

如果我有一个小于 4 MB 的文件,它可以完美运行。但是有些文件没有上传。我不知道为什么。

我收到此错误:

致命错误:未捕获的异常 'ImagickException' 带有消息 'Postscript delegate failed `/data/web/virtuals/69845/virtual/www/domains/nabytek-novydomov.cz/pdf/9.pdf':没有这样的文件或/data/web/virtuals/69845/virtual/www/domains/nabytek-novydomov.cz/funkce.php:92 中的目录@pdf.c/ReadPDFImage/611' 堆栈跟踪:#0 /data/web/virtuals/69845 /virtual/www/domains/nabytek-novydomov.cz/funkce.php(92): Imagick->readimage('/data/web/virtu...') #1 /data/web/virtuals/69845/virtual/ www/domains/nabytek-novydomov.cz/adm/includes/pdf_publisher.php(4): uploadpdf(NULL) #2 /data/web/virtuals/69845/virtual/www/domains/nabytek-novydomov.cz/adm/包含/container.php(17): include('/data/web/virtu...') #3 /data/web/virtuals/69845/virtual/www/domains/nabytek-novydomov.cz/adm/index. php(155): include('/data/web/virtu...') #4 {main} 抛出 /data/web/virtuals/69845/virtual/www/domains/nabytek-novydomov.cz/funkce.php在第 92 行

【问题讨论】:

  • 您是否尝试过为您的脚本增加memory_limit?
  • 您的脚本是否有权访问该文件?
  • 脚本可以访问该文件。如果他不接近,无论如何是行不通的。我尝试 ini_set("memory_limit","30M");但结果是一样的
  • 顺便说一句,您可能不想设置 Imagick::FILTER_UNDEFINED 它的行为是未定义的。
  • 我删除了 Imagick::FILTER_UNDEFINED,但没有任何改变

标签: php imagick


【解决方案1】:

感谢您提供示例 - 这是一个非常大的 pdf。用 ImageMagick 打开它不会给我一个错误,但是 PDF 也没有正确呈现。

ImageMagick 实际上是通过将渲染委托给 GhostScript 程序来渲染 PDF。我认为您最好直接调用 GhostScript,将 PDF 渲染为 PNG,然后在图像采用合理格式时对其进行操作,例如

要生成所有页面的PNG文件,你应该可以从命令行调用Ghostscript,只要它在你的路径中设置,如下:

gs \
-sDEVICE=png16m \
-o %03d.png \
-r300 \
casopis.pdf

或者只是选择某些页面。

gs \
-sDEVICE=png16m \
-o %03d.png \
-dFirstPage=10 \
-dLastPage=13 \
-r300 \
casopis.pdf

如果您真的想要 Jpeg 输出,可以将其配置为 output device。

我无法复制您看到的错误。这完全有可能是由于 ImageMagick 或 GhostScript 无法创建一些临时文件,或者只是内存不足。

不管怎样,答案是直接调用ghostscript,而不是要跳两层抽象来处理非常大的文件。


关于如何从命令行调用 GS 的明确说明

  1. 打开命令提示符。
  2. 转到 PDF 所在的目录。
  3. 从
  4. 运行命令

如果你想从 PHP 中调用它,你需要使用exec 或其他函数之一在命令行上调用东西。

【讨论】:

  • 我服务器上的最大上传量为 32M。这一定是一个不同的问题。
  • 网络服务器上的设置呢?错误消息“没有这样的文件或目录”强烈表明文件没有正确上传。
  • 此错误仅出现在某些pdf中,但某些pdf正确上传。如果是错误上传任何文件失败但某些文件可以上传
  • link 此 pdf 文件无效
  • 我不明白你的代码是什么,它是 php 还是什么? PS:对不起我的愚蠢:D
猜你喜欢
  • 2012-02-06
  • 2014-09-12
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2011-09-30
  • 2010-10-09
  • 2018-01-03
  • 2015-10-23
相关资源
最近更新 更多