58 votes

Obtenir le nombre de pages dans un document PDF

Cette question est pour le référencement et la comparaison. La solution est la accepté de répondre ci-dessous.

Nombre d'heures ai-je cherché un moyen rapide et facile, mais pour la plupart exactes, de façon à obtenir le nombre de pages dans un document PDF. Depuis que je travaille pour un graphique, l'impression et la reproduction de la société, qui travaille beaucoup avec les fichiers Pdf, le nombre de pages dans un document doit être connue avec précision avant le traitement. Les documents PDF sont issus de différents clients, de sorte qu'ils ne sont pas générés avec la même application et/ou n'utilisent pas la même méthode de compression.

Voici quelques-unes des réponses que j'ai trouvé insuffisant ou tout simplement ne fonctionne PAS:

À l'aide de Imagick (une extension PHP)

Imagick nécessite beaucoup de l'installation, apache doit redémarrer, et quand j'ai finalement eu de travail, il a fallu incroyablement long (2 à 3 minutes par document) et il est toujours retourné 1 page de chaque document (n'ai pas vu une copie de travail de Imagick jusqu'à présent), j'ai donc jeté. C'était à la fois avec l' getNumberImages() et identifyImage() méthodes.

À l'aide de FPDI (une bibliothèque PHP)

FPDI est facile à utiliser et à installer (il suffit d'extraire les fichiers et appeler un script PHP), MAIS beaucoup de techniques de compression ne sont pas pris en charge par FPDI. Puis, il retourne une erreur:

FPDF error: Ce document (test_1.pdf) utilise probablement une technique de compression qui n'est pas pris en charge par la libre parser livré avec FPDI.

L'ouverture d'un ruisseau et de recherche avec une expression régulière:

Cela ouvre le fichier PDF dans un flux de données et de recherches pour une sorte de chaîne de caractères contenant la propriété pagecount ou quelque chose de similaire.

$f = "test1.pdf";
$stream = fopen($f, "r");
$content = fread ($stream, filesize($f));

if(!$stream || !$content)
    return 0;

$count = 0;
// Regular Expressions found by Googling (all linked to SO answers):
$regex  = "/\/Count\s+(\d+)/";
$regex2 = "/\/Page\W*(\d+)/";
$regex3 = "/\/N\s+(\d+)/";

if(preg_match_all($regex, $content, $matches))
    $count = max($matches);

return $count;
  • /\/Count\s+(\d+)/ (regarde /Count <number>) ne fonctionne pas parce que quelques documents ont le paramètre /Count à l'intérieur, donc la plupart du temps, il ne retourne rien. Source.
  • /\/Page\W*(\d+)/ (regarde /Page<number>) n'obtient pas le nombre de pages, la plupart contient d'autres données. Source.
  • /\/N\s+(\d+)/ (regarde /N <number>) ne fonctionne pas non plus, que les documents peuvent contenir plusieurs valeurs de /N; la plupart, si pas tous, pas contenant de la propriété pagecount. Source.

Alors, que fait un travail fiable et précis?

Voir la réponse ci-dessous

85voto

GeenHenk Points 1494

Une simple ligne de commande exécutable appelé: pdfinfo.

Il est téléchargeable pour Windows et Linux. Vous téléchargez un fichier compressé contenant plusieurs petits PDF liées à les programmes. Extrait quelque part.

Un de ces fichiers est pdfinfo (ou pdfinfo.exe pour Windows). Un exemple de données renvoyées par l'exécutant sur un document PDF:

Title:          test1.pdf
Author:         John Smith
Creator:        PScript5.dll Version 5.2.2
Producer:       Acrobat Distiller 9.2.0 (Windows)
CreationDate:   01/09/13 19:46:57
ModDate:        01/09/13 19:46:57
Tagged:         yes
Form:           none
Pages:          13    <-- This is what we need
Encrypted:      no
Page size:      2384 x 3370 pts (A0)
File size:      17569259 bytes
Optimized:      yes
PDF version:    1.6

Je n'ai pas vu un document PDF où il est retourné une fausse propriété pagecount (encore). Il est également très rapide, même avec de grands documents de+ de 200 MO, le temps de réponse est un juste quelques secondes ou moins.

Il existe un moyen facile d'extraire de la propriété pagecount à partir de la sortie, ici en PHP:

// Make a function for convenience 
function getPDFPages($document)
{
    $cmd = "/path/to/pdfinfo";           // Linux
    $cmd = "C:\\path\\to\\pdfinfo.exe";  // Windows

    // Parse entire output
    exec("$cmd $document", $output);

    // Iterate through lines
    $pagecount = 0;
    foreach($output as $op)
    {
        // Extract the number
        if(preg_match("/Pages:\s*(\d+)/i", $op, $matches) === 1)
        {
            $pagecount = intval($matches[1]);
            break;
        }
    }

    return $pagecount;
}

// Use the function
$document = '"test 1.pdf"';   // Surround by double quotes if filename has spaces
echo getPDFPages($document);  // Output: 13

Bien sûr, cet outil de ligne de commande peuvent être utilisés dans d'autres langues qui peuvent analyser de sortie à partir d'un programme externe, mais je l'utiliser en PHP.

Je sais que c'est pas pur PHP, mais des programmes externes sont façon de mieux dans la gestion des PDF (comme on le voit dans la question).

J'espère que cela peut aider les gens, parce que j'ai passé beaucoup de temps à essayer de trouver une solution à cela et j'ai vu beaucoup de questions au sujet de PDF propriété pagecount dans lequel je n'ai pas trouvé la réponse que je cherchais. C'est pourquoi j'ai fait cette question et a répondu à moi-même.

1voto

Muad'Dib Points 23

si vous ne pouvez pas installer les paquets supplémentaires, vous pouvez utiliser cette ligne de commande:

foundPages=$(strings < $PDF_FILE | sed -n 's|.*Count -\{0,1\}\([0-9]\{1,\}\).*|\1|p' | sort -rn | head -n 1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: