2015-06-22 121 views
3

我有用于pdf上传的内部作业管理上传页面。该脚本将pdf的副本保存到一个目录,然后使用imagick制作一个用于在另一个页面上显示的jpg副本。大部分使用该脚本上传的PDF文件都可以正常工作(虽然速度有点慢,但内存消耗量很大,但仍能按预期工作)。我们处于服务行业,很多上传都是pdf绘图集。从CAD输出图纸通常有一大堆层,并且这些文档失败,并显示以下消息:使用imagick将PDF转换为使用imagick的JPG使用flat PDF工作,但在多层时失败

Fatal error: Uncaught exception 'ImagickException' with message 'Postscript delegate failed `../../Dropbox/Job_Docs/15-0273 La Bella, Cassandra/15-0273 La Bella, Cassandra-layout 6-22-2015 55876fa96aa00.pdf': No such file or directory @ pdf.c/ReadPDFImage/611' in /home/solargai/public_html/dash3/upload.php:79 Stack trace: #0 /home/solargai/public_html/dash3/upload.php(79): Imagick->__construct('../../Dropbox/J...') #1 {main} thrown in /home/solargai/public_html/dash3/upload.php on line 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"); 
?> 

我试图在“新的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

回答

4

Imagick调用ImageMagick库来完成图像处理。 Image Magick库本身不处理所有图像,它可以将它们的渲染委托给另一个库来处理它们。对于PDF文件,它通常委托给GhostScript库。

从命令行,如果运行convert -list configure,您应该能够在DELEGATES条目下看到ImageMagick正在使用哪些代理。

它看起来像你遇到了Ghostscript中的错误。试图通过直接调用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 drawing_with_layers.pdf

给出了错误:

GPL Ghostscript 8.70: Some glyphs of the font ArialNarrow-Bold requires a patented True Type interpreter. GPL Ghostscript 8.70: Some glyphs of the font ArialNarrow requires a patented True Type interpreter. Error: /invalidaccess in --run-- Operand stack:
--dict:8/17(L)-- F4 56.954 --dict:5/5(L)-- --dict:5/5(L)-- ArialMT --dict:11/12(ro)(G)-- --nostringval-- CIDFontObject
--dict:6/6(L)-- --dict:6/6(L)-- 178279 --dict:6/6(L)-- --nostringval-- PDFCIDFontName ArialMT Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval--
--nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1862 1 3 %oparray_pop 1861 1 3 %oparray_pop 1845 1 3
%oparray_pop --nostringval-- --nostringval-- 2 1 13
--nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval--
--nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- Dictionary stack: --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)-- Current allocation mode is local GPL Ghostscript 8.70: Unrecoverable error, exit code 1

升级到Ghostscript的9.16并没有显示这个问题和PDF已成功转换。

(顺便说一句你的PDF没有背景层,尽管有一些文字被反锯齿白色的。)

+0

感谢这么多的响应。这当然让我觉得去一个。但是,我有点碰壁。我有一些在siteground上托管的东西,当我需要软件帮助时,我通常会提交支持凭单并要求更改,并且会奇迹般地发生。 –

+0

这个页面在Godaddy的共享服务器上托管,我试图提交请求的票据,然后我发现他们不再有票务系统。所以在等待在线聊天30分钟后再等待20分钟,我找到了一个坚持说他们没有提供任何支持的人,而且我自己必须这样做。所以我登录过安全的shell,并且它一直很好,直到我进入“make install”部分,然后我得到了一堆权限被拒绝的消息。所以我认为它要我以root身份登录,但现在我意识到我无法在共享服务器上执行 –

+0

。所以我似乎被卡住了,他们不会这样做,我似乎没有许可。我有一个盒子可供他们的在线聊天在最后一小时说“0分钟”,没有人接听。去爸爸的支持是我认为我在生活中遇到的最糟糕的支持。那么有什么建议? –

0

是的,你是对的。在我的头撞在墙上一个星期后,终于开始工作了。我切换到他们的虚拟专用服务器产品。将默认软件包ghostscript 8.7升级到9.16。然后在大约10个小时试图获得依赖关系之后,意识到如果我使用exec命令调用imagick,我可以直接引用更新的imagemagick/ghostscript安装。那就是诀窍....最后!再次感谢您的帮助!

这是我终于得到了工作:

$pdf = 'sample5.pdf'; 
$save = 'output5.jpg'; 
exec('/usr/local/ImageMagick-6.9.1-6/bin/convert "'.$pdf.'" -colorspace RGB -resize 800 "'.$save.'"', $output, $return_var);