2011-06-29 1 views
0

J'utilise Apache avec PHP5 dans mon PC Windows. J'ai configuré avec succès Ghostscript et Image Magic. J'ai un script pour générer une miniature pdf comme suit;Afficher le message d'erreur personnalisé en création de miniatures pdf - PHP - Imagick

<?php 
$file = 'test.pdf'; 
$page = 1; 
$pdfpage = $page - 1; 
$nh = 200; 
$nw = 200; 

$im = new imagick(realpath($file)."[$pdfpage]"); 
$im->setCompression(Imagick::COMPRESSION_JPEG); 
$im->setCompressionQuality(100); 
$im->setImageFormat("jpeg"); 
$im->sampleImage($nw,$nh); 
$im->writeImage("test.jpg"); 
echo "true"; 
?> 

Cela fonctionne très bien pour moi. Le script génère une miniature de page correspondant à la variable $page. Mais cela ne fonctionnera pas si le numéro de page dépasse le nombre de pages disponibles dans le document. Ce que je veux, c'est afficher ou faire écho "false" si la variable d'entrée dépasse le nombre de pages disponibles dans le fichier PDF ou si la fonction imagick éprouve quelques difficultés à s'exécuter. Comment puis-je faire ceci?

Répondre

0
$file  = 'test.pdf'; 
$total_pages = 1; // Probably should already know pages but if you don't, you can find out with imagick 
$pdfpage  = $page - 1; 
$nh   = 200; 
$nw   = 200; 

try { 
    for($current_page = $total_pages; $current_page >= 0;$current_page--) { 
     $im = new imagick(realpath($file)."[$pdfpage]"); 
     $im->setCompression(Imagick::COMPRESSION_JPEG); 
     $im->setCompressionQuality(100); 
     $im->setImageFormat("jpeg"); 
     $im->sampleImage($nw,$nh); 
     $im->writeImage("test.jpg"); 
     if ($im->haspreviousimage()) { // Imagick reads pages in reverse order, thats why we're getting the previous image 
      $im->previousimage(); 
     } else { 
      break; 
     } 
    } 
} catch (ImagickException $e) { 
    die('ImagickException ' . $e->getMessage()); 
} catch (Exception $e) { 
    die('Exception ' . $e->getMessage()); 
} 
1

En théorie, vous pouvez utiliser la variable %n au paramètre -format à la commande identify pour trouver le nombre de pages (« cadres », « images ») d'un fichier donné, y compris les PDF, avant vous exécutez votre commande principale. De cette façon, vous pouvez utiliser le résultat pour remplir la valeur correcte dans votre commande principale, de sorte que vous ne recevez pas le message d'erreur en premier lieu:

identify -format %n some.pdf 

Dans pratique, cela peut être extrêmement lent (car ImageMagick semble rendre le PDF complet en premier pour compter les pages). Par conséquent, mon conseil est d'utiliser un outil de ligne de commande externe pour obtenir le nombre de pages PDF: pdfinfo. Cet outil est spécialisé sur les fichiers PDF, et il sait où chercher cette information (parce que ce numéro fait partie des métadonnées requises de tout fichier PDF, pdfinfo n'a pas besoin de rendre chaque page avant de pouvoir cracher le info):

pdfinfo some.pdf | grep Pages: 
pdfinfo some.pdf | grep Pages: | awk '{print $2}' 

Juste pour que vous voyez les différents niveaux de performance des deux commandes, je l'ai fait courir contre le fichier qui contient la spécification ISO 32000 officiel PDF 1.7:

time identify -format %n ~/Downloads/PDF32000_2008.pdf 
756 

real 0m51.902s 
user 0m50.133s 
sys 0m1.090s 


time pdfinfo ~/Downloads/PDF32000_2008.pdf | grep Pages: | awk '{print $2}' 
756 

real 0m0.138s 
user 0m0.041s 
sys 0m0.016s 

alors la différence de performance pour un document PDF de 756 pages est de 51,9 secondes contre 0,138 secondes (ou 376: 1).

J'ai également testé avec un fichier PDF de 12 pages. Ici, le ratio de performance est de 31: 1. Un PDF d'une page montre 10: 1 - tous en faveur de pdfinfo.

vieux mantra informatique: 'Utilisez l'outil pour le travail ...'