71 votes

Obtenir le nombre de pages d'un document PDF

Cette question porte sur le référencement et la comparaison. La solution est la réponse acceptée ci-dessous .

J'ai passé de nombreuses heures à chercher une solution rapide et facile, mais surtout précis Il s'agit d'un moyen d'obtenir le nombre de pages d'un document PDF. Comme je travaille pour une entreprise d'impression et de reproduction graphique qui travaille beaucoup avec des PDF, le nombre de pages d'un document doit être connu avec précision avant de le traiter. Les documents PDF proviennent de nombreux clients différents, ils ne sont donc 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ées insuffisante ou simplement Ne fonctionne pas :

Utilisation de Imagick (une extension PHP)

Imagick nécessite beaucoup d'installation, apache doit être redémarré, et lorsque j'ai finalement réussi à le faire fonctionner, le traitement était incroyablement long (2 à 3 minutes par document) et renvoyait toujours les résultats suivants 1 dans chaque document (je n'ai pas vu de copie fonctionnelle d'Imagick jusqu'à présent), alors je l'ai jeté. C'était à la fois avec le getNumberImages() y identifyImage() méthodes.

Utilisation de FPDI (une bibliothèque PHP)

FPDI est facile à utiliser et à installer (il suffit d'extraire les fichiers et d'appeler un script PHP), MAIS de nombreuses techniques de compression ne sont pas prises en charge par FPDI. Il renvoie alors une erreur :

Erreur FPDF : Ce document (test_1.pdf) utilise probablement une technique de compression qui n'est pas supportée par l'analyseur libre livré avec FPDI.

Ouverture d'un flux et recherche avec une expression régulière :

Cela ouvre le fichier PDF dans un flux et recherche une sorte de chaîne, contenant le nombre de pages 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+)/ (cherche /Count <number> ) ne fonctionne pas car seuls quelques documents possèdent le paramètre /Count à l'intérieur, donc la plupart du temps, il ne renvoie rien. Source.
  • /\/Page\W*(\d+)/ (cherche /Page<number> ) ne donne pas le nombre de pages, mais contient surtout d'autres données. Source.
  • /\/N\s+(\d+)/ (cherche /N <number> ) ne fonctionne pas non plus, car les documents peuvent contenir plusieurs valeurs de /N ; la plupart, sinon tous, pas contenant le nombre de pages. Source.

Alors, qu'est-ce qu'un travail fiable et précis ?

Voir la réponse ci-dessous

2voto

Franck Dernoncourt Points 4769

Puisque vous êtes d'accord pour utiliser des utilitaires de ligne de commande, vous pouvez utiliser cpdf (Microsoft Windows/Linux/Mac OS X). Pour obtenir le nombre de pages d'un PDF :

cpdf.exe -pages "my file.pdf"

2voto

james-geldart Points 151

J'ai créé une classe enveloppante pour pdfinfo au cas où cela serait utile à quelqu'un, en me basant sur la réponse de Richard@.

/**
 * Wrapper for pdfinfo program, part of xpdf bundle
 * http://www.xpdfreader.com/about.html
 * 
 * this will put all pdfinfo output into keyed array, then make them accessible via getValue
 */
class PDFInfoWrapper {

    const PDFINFO_CMD = 'pdfinfo';

    /**
     * keyed array to hold all the info
     */
    protected $info = array();

    /**
     * raw output in case we need it
     */
    public $raw = "";

    /**
     * Constructor
     * @param string $filePath - path to file
     */
    public function __construct($filePath) {
        exec(self::PDFINFO_CMD . ' "' . $filePath . '"', $output);

        //loop each line and split into key and value
        foreach($output as $line) {
            $colon = strpos($line, ':');
            if($colon) {
                $key = trim(substr($line, 0, $colon));
                $val = trim(substr($line, $colon + 1));

                //use strtolower to make case insensitive
                $this->info[strtolower($key)] = $val;
            }
        }

        //store the raw output
        $this->raw = implode("\n", $output);

    }

    /**
     * get a value
     * @param string $key - key name, case insensitive
     * @returns string value
     */
    public function getValue($key) {
        return @$this->info[strtolower($key)];
    }

    /**
     * list all the keys
     * @returns array of key names
     */
    public function getAllKeys() {
        return array_keys($this->info);
    }

}

1voto

dhildreth Points 359

Cela semble fonctionner assez bien, sans avoir besoin de paquets spéciaux ou d'analyser la sortie de commande.

<?php                                                                               

$target_pdf = "multi-page-test.pdf";                                                
$cmd = sprintf("identify %s", $target_pdf);                                         
exec($cmd, $output);                                                                
$pages = count($output);

1voto

dryliketoast Points 113

Cette simple doublure semble faire l'affaire :

strings $path_to_pdf | grep Kids | grep -o R | wc -l

il y a un bloc dans le fichier PDF qui détaille le nombre de pages de cette chaîne funky :

/Kids [3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R]

Le nombre de caractères "R" correspond au nombre de pages.

capture d'écran du terminal montrant la sortie des chaînes de caractères

1voto

ninfito Points 31

Vous pouvez utiliser mutool .

mutool show FILE.pdf trailer/Root/Pages/Count

mutool fait partie de la MuPDF logiciel.

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:

X