2012-02-10 62 views
24

Tôi đang sử dụng tập lệnh litte để chuyển đổi PDF sang JPG. Điều đó có hiệu quả nhưng chất lượng rất kém.Chuyển đổi PDF sang JPEG bằng PHP và ImageMagick

Kịch bản:

$im = new imagick('document.pdf[ 0]'); 
$im->setImageColorspace(255); 
$im->setResolution(300, 300); 
$im->setCompressionQuality(95); 
$im->setImageFormat('jpeg'); 
$im->writeImage('thumb.jpg'); 
$im->clear(); 
$im->destroy(); 

hơn Một điều, tôi muốn giữ lại kích thước ban đầu của PDF nhưng việc chuyển đổi cây trồng kích thước của JPG.

Trả lời

37

Có thể thực hiện bằng cách sử dụng setResolution, nhưng bạn cần thực hiện việc này trước khi tải hình ảnh. Hãy thử một cái gì đó như thế này:

// instantiate Imagick 
$im = new Imagick(); 

$im->setResolution(300,300); 
$im->readimage('document.pdf[0]'); 
$im->setImageFormat('jpeg');  
$im->writeImage('thumb.jpg'); 
$im->clear(); 
$im->destroy(); 
+3

Dường như trong một số trường hợp, ImageMagick yêu cầu Ghostscript phải được cài đặt, vì nếu không nó sẽ ném một lỗi Postscript không thành công – Zsolti

+0

Tại sao trên thế giới setRageolution và setImageResolution làm những việc khác nhau và có cùng mô tả trong tài liệu ?! Cảm ơn bạn, bạn hoàn toàn cứu tôi. – Hissvard

1

Đảm bảo rằng PDF được tạo với cấu hình màu chính xác, tôi đã từng JPG của tôi bị xóa sạch sau khi thay đổi kích thước do tệp nguồn đã được tạo với cấu hình màu sai. Xem thêm: ImageMagick PDF to JPEG conversion results in green square where image should be

+0

Đó không phải là vấn đề. –

+0

Đây phải là nhận xét, một nhận xét rất thú vị, không phải là câu trả lời. – Machado

5

Chất lượng của hình ảnh được sản xuất từ ​​PDF có thể được thay đổi bằng cách thiết lập density (đó là Sở KH & ĐT) trước khi đọc trong PDF - đây được quá khứ để ghostscript (gs) bên dưới mà rasterizes PDF. Để có kết quả tốt, hãy thay thế mẫu gấp đôi mật độ bạn yêu cầu và sử dụng resample để quay lại DPI mong muốn. Hãy nhớ thay đổi colorspace thành RGB nếu bạn muốn có ảnh JPEG RGB.

Một phiên bản dòng lệnh điển hình cho convert có thể là:

convert -density 600 document.pdf[0] -colorspace RGB -resample 300 output.jpg 

Nếu bạn cần để cắt nó, một lệnh -shave sau resample thường là hợp lý, nếu hình ảnh tập trung trong trang.

Đối với PHP IMagick extension, tốt, tôi không bao giờ cá nhân sử dụng nó - vì vậy không chắc chắn về cách bạn chỉ định gợi ý đọc tệp cho nó, nhưng tôi hy vọng điều đó là có thể.

3
$im = new imagick(); 

//this must be called before reading the image, otherwise has no effect 

$img->setResolution(200,200); 

//read the pdf 

$img->readImage("{$pdf_file}[0]"); 
0

Bấm here để biết thêm chi tiết. Hãy thử điều này:

HTML

<html> 

    <body> 

    <form action="ConvertPdfToImg.php" enctype="multipart/form-data" method="post" name="f1"> 

     <input id="templateDoc" name="templateDoc" type="file" /> 

     <input type="submit" /> 

    </form> 

    </body> 

</html> 

PHP

$pdfAbsolutePath = __DIR__."/test.pdf"; 

if (move_uploaded_file($_FILES['templateDoc']["tmp_name"], $pdfAbsolutePath)) { 

     $im    = new imagick($pdfAbsolutePath); 

     $noOfPagesInPDF = $im->getNumberImages(); 

     if ($noOfPagesInPDF) { 

      for ($i = 0; $i < $noOfPagesInPDF; $i++) { 

       $url = $pdfAbsolutePath.'['.$i.']'; 

       $image = new Imagick($url); 

       $image->setImageFormat("jpg"); 

       $image->writeImage(__DIR__."/".($i+1).'-'.rand().'.jpg'); 

      } 

      echo "All pages of PDF is converted to images"; 

     } 
     echo "PDF doesn't have any pages"; 

} 
+0

Bạn hoàn toàn bị mất điểm và tất cả các yêu cầu xử lý này là hoàn toàn không liên quan đến câu hỏi. Và bạn nên luôn luôn nói rõ ràng rằng bạn đang trỏ đến blog của riêng bạn. –

Các vấn đề liên quan