2011-12-24 74 views
26

Tôi đang cố gắng chuyển đổi PDF sang IMG (JPG) với trợ giúp PHP.Chuyển đổi PDF sang JPG bằng cách sử dụng PHP

Tôi đang sử dụng tiện ích mở rộng tưởng tượng.

đây là mã của tôi

$fp_pdf = fopen($pdf, 'rb'); 

    $img = new imagick(); // [0] can be used to set page number 
    $img->readImageFile($fp_pdf); 
    $img->setImageFormat("jpg"); 
    $img->setImageCompression(imagick::COMPRESSION_JPEG); 
    $img->setImageCompressionQuality(90); 

    $img->setResolution(300,300); 

    $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 

    $data = $img->getImageBlob(); 

file nguồn pdf của tôi có chiều hướng đúng (210x297 mm, như A4 có). Và mọi thứ đều tốt. Nhưng jpg của tôi có kích thước trang là 842x595 px và DPI là 72.

và tệp img nhỏ hơn nhiều trên giấy sau đó pdf, khi tôi đã in.

một cách thích hợp để làm cho file ảnh từ pdf và làm cho nó quá lớn như pdf (trên giấy)

+0

Cuối cùng tôi đã thực hiện tất cả mọi thứ thông qua GhostScript console lệnh (gs), kết quả là tuyệt vời! tốc độ nhanh! rất nhanh! – user1016265

Trả lời

5

ImageMagick sử dụng GhostScript để xử lý các tệp JPEG, vì vậy, bạn nên làm trực tiếp tốt hơn với exec GhostScript, điều này sẽ hiệu quả hơn nhiều và cung cấp cho bạn nhiều quyền kiểm soát hơn. Nó cũng sẽ chỉ là 1 exec tuyên bố, thay vì chơi xung quanh với các chức năng IMagick.

+0

trong dự án thực tế tôi đã excatly như bạn đề nghị. Nó hoạt động nhanh hơn và kết quả được mong đợi nhiều hơn;) – user1016265

8

Dường như bạn đã bỏ lỡ hai setters là gì:

Imagick :: setImagePage() http://www.php.net/manual/en/function.imagick-setimagepage.php

Và:

Imagick :: setImageExtent() http://www.php.net/manual/en/function.imagick-setimageextent.php

để có được các pa đúng rameters cho các chức năng này, bạn có thể thử như sau:

$fp_pdf = fopen($pdf, 'rb'); 
$params=array(); 

    $img = new imagick(); 
    $img->readImageFile($fp_pdf); 
    /*my modification: */$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 
    /*my modification: */$params=$img->identifyImage(); 
    $img->setImageFormat("jpg"); 
    $img->setImageCompression(imagick::COMPRESSION_JPEG); 
    $img->setImageCompressionQuality(90); 
    /*my modification: */$img->setPage($params['geometry']['width'], $params['geometry']['height'], 0, 0) 
    /*my modification: */$img->setResolution($params['resolution']['x'], $params['resolution']['y']); 
    $img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 
    $data = $img->getImageBlob(); 

Nếu bạn thấy rằng một số thuộc tính khác nên được đặt, thì hãy để tôi cho bạn biết thông tin mà $ params đang giữ. Nó có thể chứng minh hữu ích cho bạn:

$params=array(
    [imageName], 
    [format], 
    [geometry] => Array 
     (
      [width] 
      [height] 
     ) 
    [type], 
    [colorSpace], 
    [resolution], 
     (
      [x] 
      [y] 
     ) 

    [units], 
    [fileSize], 
    [compression], 
    [signature], 

)

Thành thật mà nói, tôi không hoàn toàn chắc chắn nếu điều này sẽ làm việc. Chỉ là một thử để giúp bạn. Tôi chân thành hy vọng nó.

+0

Cảm ơn câu trả lời, nhưng làm thế nào tôi có thể tưởng tượng giá trị tôi nên vượt qua trong các chức năng này là gì? PDF có khổ giấy A4, làm thế nào để tôi biết làm thế nào chất nhầy trong px nó nên làm cho cùng một kích thước trên giấy? hoặc cho mục đích in ấn chỉ có giá trị DPI sẽ được sử dụng? – user1016265

+0

Oh! Tôi hiểu rồi ... hãy để tôi viết lại câu trả lời của mình để thêm một số chi tiết –

+0

nó không giúp ích gì. Đây là thông tin về pdf http://o7.no/uAMcLa. Điều kỳ lạ chính là, tôi đã thực hiện chuyển đổi này bằng shell_exec ("chuyển đổi mật độ 300-đơn vị pixelpinch + mờ trong"). và hình ảnh kết quả trở thành kích thước mong muốn. – user1016265

0

Bạn phải gọi setResolution trước khi đọc hình ảnh. Nếu không, imagemagick sẽ sử dụng dpi hệ thống mặc định.

10

Bạn có thể sử dụng imagemagick thông qua exec() hoặc tương tự, đối số trình bao ít chi tiết hơn so với phần mở rộng PHP.

$pdf_file = escapeshellarg("mysafepdf.pdf"); 
$jpg_file = escapeshellarg("output.jpg"); 

$result = 0; 
exec("convert -density 300 {$pdf_file} {$jpg_file}", null, $result); 

// at this point $result should == 0 if the conversion was successful 

Tùy chọn "mật độ" (đặt DPI để đọc tệp nguồn dưới dạng) cụ thể khắc phục sự cố của bạn.

Cũng tưởng tượng theo mặc định sử dụng cài đặt chất lượng 92 để viết JPEG trong hầu hết các trường hợp - vì vậy bạn có thể không cần khai báo rõ ràng.

3

Như đã đề cập trước đó, thiết lập độ phân giải trước khi đọc các tập tin không lừa:

$fp_pdf = fopen($pdf, 'rb'); 

$img = new imagick(); // [0] can be used to set page number 
$img->setResolution(300,300); 
$img->readImageFile($fp_pdf); 
$img->setImageFormat("jpg"); 
$img->setImageCompression(imagick::COMPRESSION_JPEG); 
$img->setImageCompressionQuality(90); 

$img->setImageUnits(imagick::RESOLUTION_PIXELSPERINCH); 

$data = $img->getImageBlob(); 
Các vấn đề liên quan