2015-02-02 29 views
5

Używam imagicka, aby przekonwertować pdf na jpg w skrypcie, który mam ... działa dobrze, jeśli podam bezpośrednią ścieżkę do przesłanego pliku pdf bez strona określony, ale po dodaniu [0] na końcu ścieżki pliku, aby określić, że chcę tylko czytać pierwszą stronę, to bomby odchodzący z powodu następującego błędu:Otrzymywanie błędnego pliku o błędzie podczas konwersji pierwszej strony pdf na jpg

"Fatal error: Uncaught exception 'ImagickException' with message 'Invalid filename provided' Imagick->readImage()"

ja również próbowałem przy użyciu '/path/to/file.pdf[0]' bezpośrednio w konstruktorze bez powodzenia, ale bez specyfikatora strony, który również działa dobrze.

Zgodnie z dokumentacją ... to powinno działać. Co ja tu robię źle?

$doc_preview = new Imagick(); 
$doc_preview->setResolution(180,180); 
$doc_preview->readImage('/path/to/file.pdf[0]'); 
$doc_preview->setImageFormat('jpeg'); 
$doc_preview->writeImage('/path/to/file.jpg'); 
$doc_preview->clear(); 
$doc_preview->destroy(); 

AKTUALIZACJA: Powinienem wspomnieć, że używam HHVM. Nie jestem pewien, czy to by miało znaczenie w tym przypadku ... ale jestem.

UPDATE2: Otworzyłem an issue na repozytorium HHVM github. Mam nadzieję, że naprawią ten błąd ... do tego czasu odpowiedź, którą poprawiłem poniżej, jest przyzwoitym (choć hackowskim) rozwiązaniem.

+0

To błąd. Funkcja nie jest obsługiwana, ale powtarzana w całym podręczniku PHP. Duplikat: http://stackoverflow.com/q/11114747/1163786 Rozwiązanie za pomocą setIteratorIndex() na stronie: http://stackoverflow.com/a/22673725/1163786 –

+0

Dobre znalezisko ... Zrozumiałem to czytając wszystkie obsługiwane metody ... ale nadal ... w najlepszym razie nie są intuicyjne. Nie uważam też mojego rozwiązania za duplikat, ponieważ nie próbuję iterować i tworzyć wielu obrazów ... i dlatego nie mogłem znaleźć tego rozwiązania podczas wcześniejszego wyszukiwania. – kevindeleon

+0

Przepraszam, Kevin - nie zauważyłem, że ten problem dotyczy rozszerzenia HHVM. –

Odpowiedz

3

OK ... więc (rodzaj hacky) sposób naprawić to w mojej sytuacji jest użycie fopen(), a następnie użyć setIteratorIndex(0), który jest nieziemski HIGLY. Ale dla tych, którzy mają ten sam problem ... proszę bardzo!

$pdf_handle = fopen('/path/to/file.pdf', 'rb'); 

$doc_preview = new Imagick(); 
$doc_preview->setResolution(180,180); 
$doc_preview->readImageFile($pdf_handle); 
$doc_preview->setIteratorIndex(0); 
$doc_preview->setImageFormat('jpeg'); 
$doc_preview->writeImage('/path/to/file.jpg'); 
$doc_preview->clear(); 
$doc_preview->destroy(); 
1

Nie mam zdjęcia w moim komputerze, ale mogę zgadnąć, na czym polega problem. Problem polega na tym, że po otwarciu pliku PDF z częścią strony nie można uwzględnić ciągu ścieżki do katalogu zawierającego ukośnik w przód. Myślę, że ponieważ czytałem stronę funkcji readImage z php.net tutaj http://php.net/manual/en/imagick.readimage.php i tam nie zawierają ścieżki do katalogu, więc przypuszczam, że jest to szybki ale kontynuujący. Należy spróbować zmienić katalog na plik PDF, korzystając z chdir() (http://php.net/manual/en/function.chdir.php), a następnie wypróbować taką samą funkcję, jak ta $doc_preview->readImage('file.pdf[0]'); bez ścieżki do katalogu. Najprawdopodobniej to zadziała. Niektóre API mają gromki i trzeba je obejść.

+0

Doceniam domysły, ale nie jestem pewien, czy użycie 'chdir()' jest dobrą opcją. Jeśli to naprawdę jest problem ... to jest rozczarowujący błąd. – kevindeleon

1

readImage() wymaga, że ​​$ filename jest ścieżką bezwzględną.

Jeśli chcesz użyć ścieżki względnej, użyj funkcji realpath(), która zamienia ścieżkę względną na bezwzględną ścieżkę pliku.

Zamiast

$imagick->readImage('/path/to/file.pdf[0]'); 

spróbować

$imagick->readImage(realpath("/path/to/file.pdf")."[0]"); 
+0

Poza tym, że używam absolutnych ścieżek serwera ... nie ścieżek względnych ... i dlatego działa, jeśli nie używam specyfikatora strony na końcu.Problem polega na tym, że PHP/Imagemagick nie akceptuje nazwy pliku ze specyfikatorem strony, jeśli ścieżka jest podana ... co wydaje się być błędem. Powinien zaakceptować nazwę pliku ze specyfikatorem strony lub pełną ścieżką do pliku ze specyfikatorem strony, ale tak nie jest. Będę jednak sprawdzać, czy być pewnym. – kevindeleon