2012-06-20 1 views
1

Нагрузки ответов о том, как это сделать для командной строкиPDF для выбора JPG Imagic страницы

convert /path/to/file/file.pdf[3] output.jpg 

большой ... но что, если я использую в обработке памяти, я генерации PDF с PDFlib, а затем вывести свой буфер в функцию, которую я хочу создать предварительный просмотр jpg выбранной страницы. Как? Мой код:

[...] 
    $buf = $pdf->get_buffer(); 

    //$buff is just a PDF stored in a string now. 

    $im = new Imagick(); 
    $im->readimageblob($buf); 

    $im->setImageFormat("jpg"); 
    $im->setimagecompressionquality(60); 

    $len = strlen($im); 
    header("Content-type: image/jpeg"); 
    header("Content-Length: $len");  
    header("Content-Disposition: inline; filename=test.jpg"); 

    echo $im; 

Это создает jpeg, но всегда возвращает последнюю страницу PDF. Я хочу иметь возможность выбрать, какой из них будет преобразован. Это выполнимо без сохранения временных файлов и использования синтаксиса командной строки (exec('convert /path/to/file/file.pdf[3] output.jpg'))?

Позвольте мне добавить, что я попытался

$im->readimageblob($buf[2]); 

и это не сработало :)

+0

Что вы имеете в виду «без использования [] синтаксис»? –

+0

Извините, что не ясен, обновил сообщение – RandomWhiteTrash

ответ

1

Это не очень хорошая новость, к сожалению, но я могу определенно сказать, что, по состоянию на момент написания статьи, ImageMagick (и библиотеки PHP) не поддерживают обозначение страницы, которое вы пытаетесь использовать. (Для людей, которые в будущем найдут это: я проверяю php-imagick-3.0.1 и imagemagick-6.6.0.4).

Я пытаюсь сделать то же самое, что и вы, и я провел последние несколько часов, пробираясь через источник, пытаясь понять, что он делает и как он получает страницы, и это выглядит он просто не будет использовать его при чтении из потока (т. е. вызов readBlob()).

Как таковой, я просто собираюсь помещать его во временный файл и вместо этого читаю его. Не так элегантно, но это сработает.

+0

Вы правы. Мне нужно будет сделать то же самое - или создать только одну страницу, которую я хочу просмотреть одновременно. Спасибо, что подтвердил мои подозрения. – RandomWhiteTrash

2

версия 3.0.1 будучи на последнем изображении или первого изображения объекта IMAGIC

$image_obj = new Imagick("test.pdf"); то на последнем изображении в $ image_obj

если вы используете

fp_pdf = fopen("test.pdf", 'rb'); 
$image_obj = new Imagick(); 
$image_obj -> readImageFile($fp_pdf); 

тогда вы на первое изображение в $ image_obj

Во втором случае, чтобы перейти к последнему изображению, вы можете сделать

fp_pdf = fopen("test.pdf", 'rb'); 
$image_obj = new Imagick(); 
$image_obj -> readImageFile($fp_pdf,2); // 2 can be any positive number? 

то на последнем изображении в $ image_obj

echo $image_obj->getNumberImages() // Returns the number of images in the object 

затем

if ($image_obj->hadPreviousImage) 
     $image_obj->previousImage() //Switch to the previous image in the object 
    } 

или

if ($image_obj->hasNextImage()) { 
    $image_obj->nextImage()) //Switch to the next image in the object 
} 

напримересли у вас есть всего 6 изображений, и вы должны четвёртым то сделать с конца

$image_obj->previousImage() 
$image_obj->previousImage() 
$image_obj->setImageFormat("png"); 
header("Content-Type: image/png"); 
echo $image_obj; 

EDIT: Еще одна находкой является то, что вы можете

foreach($image_obj as $slides) { 
    echo "<br>".$Obj_img->getImageWidth(); 
    //or wehatever you need to do. 
} 

EDIT 2: Очень простое решение было бы используйте эту функцию. $image_obj->setIteratorIndex(4) отсчет начинается с нуля.

3

Для тех, кто все еще ищет решение чтения определенного количества страниц из сгустка, пожалуйста, проверьте этот вопрос Creating array populated by images from a PDF using PHP and ImageMagick

$img_array = array(); 
$im = new imagick(); 
$im->setResolution(150,150); 
$im->readImageBlob($pdf_in); 
$num_pages = $im->getNumberImages(); 
for($i = 0;$i < $num_pages; $i++) 
{ 
    $im->setIteratorIndex($i); 
    $im->setImageFormat('jpeg'); 
    $img_array[$i] = $im->getImageBlob(); 
} 
$im->destroy(); 
+0

'$ im-> setIteratorIndex ($ i);' отлично подходит для меня, чтобы выбрать определенную «страницу», загруженную из pdf для работы. – csjpeter

Смежные вопросы