我有一个内部的工作管理上传页面为pdf上传。脚本将pdf的副本保存到一个目录中,然后使用imagick生成一个jpg副本,用于显示在另一个页面上。大多数使用脚本上传的PDF都工作得很好(尽管速度有点慢,占用内存..但仍按预期工作)。我们从事服务业务,很多上传的都是pdf图形集。从CAD导出的图形通常有一大堆层,这些文档失败时会显示以下消息:
致命错误:未捕获的异常“imagickexception”,消息为“postscript delegate failed”../../dropbox/job-docs/15-0273 la bella,cassandra/15-0273 la bella,cassandra layout 6-22-2015 55876fa96aa00.pdf':没有这样的文件或目录@pdf.c/readpdfimage/611'in/home/solargai/public\u html/dash3/upload.php:79堆栈跟踪:0/home/solargai/public\u html/dash3/upload.php(79):imagick->\u构造('../../dropbox/j...')1{main}/home/solargai/public_html/dash3/upload.php,第79行
因此,如果我将这些问题中的一个pdf保存到桌面,然后通过pdf打印机(在本例中为cutepdf)重新保存,然后再次尝试上载它,它可以正常工作。所以这就是为什么我假设它是图层…因为当我使用pdf打印机时,它们被剥离并展平。
起初我认为文档的大小是相关的,但后来我意识到我可以循环浏览几乎100页而不会失败(绘图集通常大约是15页左右)。

    <?php

set_time_limit(0);
ignore_user_abort(1);

session_start();



$uuid = uniqid();
$today = date("n-j-Y");

$jobname = $_POST['jobname'];
$_SESSION['jobname'] = $jobname;
$uploadType = $_POST['uploadType'];
$writeSTATE = $_POST['writeSTATE'];
$fileName = $jobname."-".$uploadType." ".$today." ".$uuid;

$fileNamePDF = $fileName.".pdf";
$path = "../dash2/jobinfoDOCS/".$jobname."/".$uploadType."/";
$DOCSpath = "../../Dropbox/Job_Docs/".$jobname."/";

//////remove directory
if($writeSTATE == "overwrite") {

        $filesD = glob($path . '*', GLOB_MARK);
        foreach ($filesD as $fileD) {
            if (substr($fileD, -1) == '/')
                delTree($fileD);
            else
                unlink($fileD);
        }
        rmdir($path);

}
if (!file_exists($path)) {
    mkdir($path, 0777, true);
    //echo "created folder for path: " . $path;
}
if (!file_exists($DOCSpath)) {
    mkdir($DOCSpath, 0777, true);
    //echo "created folder for path: " . $DOCSpath;
}



//echo "upload type: " . $_POST['uploadType'] . "<br>";
//echo "path: " . $path . "<br>";

//echo $_FILES['layout']['tmp_name'];
   if (is_uploaded_file($_FILES['layout']['tmp_name'])) {
      if ($_FILES['layout']['type'] != "application/pdf") {
         //echo "<p>Class notes must be uploaded in PDF format.</p>";
      } else {
         $name = $_POST['name'];
         $result = move_uploaded_file($_FILES['layout']['tmp_name'], $DOCSpath.$fileNamePDF);

///write pdf to jpg

       //  if ($result == 1) echo "<p>File successfully uploaded.</p>";
         //else echo "<p>There was a problem uploading the file.</p>";
      } #endIF
   } #endif

$fi = new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS);
//printf("There were %d Files", iterator_count($fi));
$fileCOUNT = iterator_count($fi);
//echo $fileCOUNT;

$PDFpath = $DOCSpath.$fileNamePDF;

$img = new imagick($PDFpath);
$img = $img->flattenImages();
$img->setResolution(175,175);
$number = $img->getnumberimages();
for($i=0;$i<$number;++$i)
{
$count = $i + $fileCOUNT;
    $JPGpath = $path.$count."--".$fileName.".jpg";
//echo $PDFpath."AND".$JPGpath;
$img->readImage("{$PDFpath}[".$i."]");
$img->writeImage("{$JPGpath}");
}
header("location:index.php");
?>

我试着在“new imagick”下面添加“flattenimages”,但没有任何帮助。我还尝试隔离该函数,并使用tmp文件为imagick函数创建。我也试过很多其他的东西,整个周末都在忙着做,现在我只是一无所获,所以任何帮助都会非常感谢。
如果有助于说明导致问题的分层PDF的链接,请执行以下操作:
https://www.dropbox.com/s/unauyb0rzpk0nup/drawing_with_layers.pdf?dl=0
下面是通过可爱的pdf编写器成功上传的副本
https://www.dropbox.com/s/dv0bt7x222s93mi/no_layers.pdf?dl=0

最佳答案

imagick调用imagemagick库来完成它对图像的所有处理。图像magick库不能处理所有图像本身,它可以将它们的呈现委托给另一个库来处理它们。对于pdf文件,它通常委托给ghostscript库。
在命令行中,如果运行convert-list configure,您应该能够在delegates项下看到ImageMagick正在使用哪些委托。
看起来你在鬼脚本中遇到了一个bug。尝试通过使用以下命令直接调用GS版本8.70来转换PDF:
GS-Q-Dquiet-Dsafer-Dbatch-Dnopause-Dnoprompt酒店
-dmaxbitmap=500000000-daligntopixels=0-dgridfittt=1-sdevice=pngalpha-dtextalphabits=4-dgraphicsalphabits=4-r150-soutputfile=foo-%d.png带图层的绘图.pdf
给出错误:
GPL Ghostscript 8.70:阿里亚箭头粗体字体的一些图示符
需要获得专利的真类型解释器。GPL Ghostscript 8.70:一些
arialnarrow字体的字形需要获得专利的真类型
翻译。错误:/invalidaccess in--run--operand堆栈:
--dict:8/17(l)--f4 56.954--dict:5/5(l)----dict:5/5(l)--阿里亚尔米特--dict:11/12(ro)(g)---诺斯灵瓦尔--cidfontobject
--dict:6/6(l)----dict:6/6(l)--178279--dict:6/6(l)----nostringval--pdfcidfontname arialmt执行堆栈:%interp_exit.runexec2--nostringval----nostringval--
--nostringval--2%停止了_push--nostringval--nostringval--nostringval--false 1%停止了_push 1862 1 3%oparray_pop 1861 3%oparray_pop 1845 1 3
%奥帕雷·波普——诺斯灵瓦尔————诺斯灵瓦尔——2 1 13
--nostringval--%for_pos_int_continue--nostringval--nostringval----nostringval--nostringval--%array_continue--nostringval--false 1%stopped\u push--nostringval--%loop_continue--nostringval--nostringval--nostringval--nostringval--
--NoStringVal--NoStringVal--NoStringVal--Array--U Continue--NoStringVal--NoStringVal--NoStringVal--NoStringVal--NoStringVal--NoStringVal--NoStringVal--NoStringVal--Dictionary堆栈:-dict:1154/1684(ro)(g)---dict:1/20(g)---dict:75/200(l)---dict:75/200(l)---dict:106/127(ro)(g)----dict:286/300(ro)(g)---dict:22/25(l)---dict:4/6(l)---dict:21/40(l)---dict:1/1(ro)(g)--当前分配模式为本地GPL ghostscript 8.70:不可恢复错误,
退出代码1
升级到Ghostscript 9.16不会显示此问题,PDF已成功转换。
(顺便说一下,尽管有些文本被反锯齿为白色,但pdf没有背景层。)

10-04 10:40