it-swarm.com.de

Holen Sie sich die Anzahl der Seiten in a PDF dokumentieren

Diese Frage dient zum Referenzieren und Vergleichen. Die Lösung ist die akzeptierte Antwort .

Viele Stunden habe ich nach einer schnellen und einfachen, aber meistens genauen- Methode gesucht, um die Anzahl der Seiten in einem PDF -Dokument abzurufen. Da ich für eine grafische Druck- und Reproduktionsfirma arbeite, die viel mit PDFs arbeitet, muss die Anzahl der Seiten in einem Dokument genau bekannt sein, bevor sie verarbeitet werden. PDF -Dokumente stammen von vielen verschiedenen Clients. Sie werden also nicht mit derselben Anwendung generiert und/oder verwenden nicht die gleiche Komprimierungsmethode.

Hier sind einige der Antworten, die ich gefunden habe: unzureichend oder einfach funktioniert nicht:

Imagick (eine PHP - Erweiterung) verwenden

Imagick erfordert viel Installation, Apache muss neu gestartet werden, und als ich es endlich funktionierte, dauerte es erstaunlich lange (2-3 Minuten pro Dokument), und es wurde immer 1-Seite in jedem Dokument zurückgegeben (funktionierte nicht) Kopie von Imagick bis jetzt), also warf ich es weg. Das war sowohl mit den Methoden getNumberImages() als auch mit identifyImage() möglich.

FPDI (eine PHP - Bibliothek) verwenden

FPDI ist einfach zu verwenden und zu installieren (einfach Dateien extrahieren und ein PHP - Skript aufrufen), , ABER. Viele der Komprimierungstechniken werden von FPDI nicht unterstützt. Dann wird ein Fehler zurückgegeben:

FPDF-Fehler: In diesem Dokument (test_1.pdf) wird wahrscheinlich eine Komprimierungstechnik verwendet, die vom kostenlosen Parser, der mit FPDI geliefert wird, nicht unterstützt wird.

Einen Stream öffnen und mit einem regulären Ausdruck suchen:

Dadurch wird die Datei PDF in einem Stream geöffnet und nach einer Art Zeichenfolge gesucht, die die Seitenzahl oder etwas Ähnliches enthält.

$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+)/ (sucht nach /Count <number>) funktioniert nicht, da nur in wenigen Dokumenten der Parameter /Count enthalten ist. Daher wird meistens nichts zurückgegeben. Quelle.
  • /\/Page\W*(\d+)/ (sucht nach /Page<number>) erhält nicht die Seitenzahl, sondern enthält meistens andere Daten. Quelle.
  • /\/N\s+(\d+)/ (sucht nach /N <number>) funktioniert ebenfalls nicht, da die Dokumente mehrere Werte von /N enthalten können; die meisten, wenn nicht alle, nicht, die die Seitenzahl enthalten. Quelle.

Was funktioniert also zuverlässig und genau?

Siehe die Antwort unten

53
Richard de Wit

Eine einfache ausführbare Befehlszeile mit dem Namen: pdfinfo.

Es ist für Linux und Windows herunterladbar . Sie laden eine komprimierte Datei mit mehreren kleinen PDF-Programmen herunter. Extrahiere es irgendwo.

Eine dieser Dateien ist pdfinfo (oder pdfinfo.exe für Windows). Ein Beispiel für Daten, die durch Ausführen in einem PDF -Dokument zurückgegeben werden:

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

Ich habe kein Dokument PDF gesehen, in dem (noch) eine falsche Seitenzahl zurückgegeben wurde. Es ist auch sehr schnell, selbst bei großen Dokumenten von mehr als 200 MB beträgt die Antwortzeit nur wenige Sekunden oder weniger.

Es gibt eine einfache Möglichkeit, die Seitenzahl aus der Ausgabe zu extrahieren, hier in PHP:

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

    // Parse entire output
    // Surround with double quotes if file name has spaces
    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
echo getPDFPages("test 1.pdf");  // Output: 13

Natürlich kann dieses Befehlszeilentool auch in anderen Sprachen verwendet werden, in denen Ausgaben eines externen Programms analysiert werden können, aber ich verwende es in PHP.

Ich weiß, dass es nicht rein PHP ist, aber externe Programme sind way in der Handhabung von PDF besser (wie in der Frage gesehen).

Ich hoffe, das kann den Leuten helfen, denn ich habe viel Zeit damit verbracht, die Lösung dafür zu finden, und ich habe eine Menge Fragen zu PDF Seitenzahlen gesehen, in denen ich keine Antwort gefunden habe zum. Deshalb habe ich diese Frage gestellt und selbst beantwortet.

77
Richard de Wit

Am einfachsten ist die Verwendung von ImageMagick  

hier ist ein Beispielcode

$image = new Imagick();
$image->pingImage('myPdfFile.pdf');
echo $image->getNumberImages();

ansonsten können Sie auch PDF-Bibliotheken wie MPDF oder TCPDF für PHP verwenden.

15
Kuldeep Dangi

Wenn Sie Zugriff auf Shell haben, ist die Verwendung von grep eine der einfachsten (jedoch bei 100% der PDFs nicht verwendbaren) Methoden.

Dies sollte nur die Anzahl der Seiten zurückgeben:

grep -m 1 -aoP '(?<=\/N )\d+(?=\/)' file.pdf

Beispiel: https://regex101.com/r/BrUTKn/1

Schalterbeschreibung:

  • -m 1 ist erforderlich, da einige Dateien mehr als eine Übereinstimmung des Regex-Musters haben können (Volonteer wird benötigt, um dies durch die Match-Only-First-Regex-Lösungserweiterung zu ersetzen)
  • -a ist notwendig, um die Binärdatei als Text zu behandeln
  • -o, um nur die Übereinstimmung anzuzeigen
  • -P, um den regulären Perl-Ausdruck zu verwenden

Regex Erklärung:

  • start "Trennzeichen": (?<=\/N ) Lookbehind von /N (nb. Leerzeichen, das hier nicht zu sehen ist)
  • tatsächliche Ergebnis: \d+ beliebig viele Stellen
  • endung "Trennzeichen": (?=\/) Lookahead von /

Hinweis: Wenn in einigen Fällen keine Übereinstimmung gefunden wird, kann davon ausgegangen werden, dass nur 1 Seite vorhanden ist.

1
Saran

Da die Verwendung von Befehlszeilendienstprogrammen in Ordnung ist, können Sie cpdf (Microsoft Windows/Linux/Mac OS X) verwenden. So ermitteln Sie die Anzahl der Seiten in einem PDF:

cpdf.exe -pages "my file.pdf"
1

Sie können qpdf wie folgt verwenden. Wenn eine Datei dateiname.pdf 100 Seiten hat,

$ qpdf --show-npages file_name.pdf
100
1
SuperNova

Dies scheint ziemlich gut zu funktionieren, ohne dass spezielle Pakete oder eine Befehlsausgabe erforderlich sind.

<?php                                                                               

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

Hier ist eine R-Funktion, die die Seitennummer der PDF -Datei mit dem Befehl pdfinfo meldet. 

pdf.file.page.number <- function(fname) {
    a <- pipe(paste("pdfinfo", fname, "| grep Pages | cut -d: -f2"))
    page.number <- as.numeric(readLines(a))
    close(a)
    page.number
}
if (F) {
    pdf.file.page.number("a.pdf")
}
0
Feiming Chen

wenn Sie keine zusätzlichen Pakete installieren können, können Sie diesen einfachen Einzeiler verwenden:

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

Das R-Paket pdftools und die Funktion pdf_info() geben Auskunft über die Anzahl der Seiten in einem PDF.

library(pdftools)
pdf_file <- file.path(R.home("doc"), "NEWS.pdf")
info <- pdf_info(pdf_file)
nbpages <- info[2]
nbpages

$pages
[1] 65
0
emeryville

Hier ist ein Windows-Befehlsskript, das gsscript verwendet und die Seitennummer der PDF -Datei angibt

@echo off
echo.
rem
rem this file: getlastpagenumber.cmd
rem version 0.1 from commander 2015-11-03
rem need Ghostscript e.g. download and install from http://www.ghostscript.com/download/
rem Install path "C:\prg\ghostscript" for using the script without changes \\ and have less problems with UAC
rem

:vars
  set __gs__="C:\prg\ghostscript\bin\gswin64c.exe"
  set __lastpagenumber__=1
  set __pdffile__="%~1"
  set __pdffilename__="%~n1"
  set __datetime__=%date%%time%
  set __datetime__=%__datetime__:.=%
  set __datetime__=%__datetime__::=%
  set __datetime__=%__datetime__:,=%
  set __datetime__=%__datetime__:/=% 
  set __datetime__=%__datetime__: =% 
  set __tmpfile__="%tmp%\%~n0_%__datetime__%.tmp"

:check
  if %__pdffile__%=="" goto error1
  if not exist %__pdffile__% goto error2
  if not exist %__gs__% goto error3

:main
  %__gs__% -dBATCH -dFirstPage=9999999 -dQUIET -dNODISPLAY -dNOPAUSE  -sstdout=%__tmpfile__%  %__pdffile__%
  FOR /F " tokens=2,3* usebackq delims=:" %%A IN (`findstr /i "number" test.txt`) DO set __lastpagenumber__=%%A 
  set __lastpagenumber__=%__lastpagenumber__: =%
  if exist %__tmpfile__% del %__tmpfile__%

:output
  echo The PDF-File: %__pdffilename__% contains %__lastpagenumber__% pages
  goto end

:error1
  echo no pdf file selected
  echo usage: %~n0 PDFFILE
  goto end

:error2
  echo no pdf file found
  echo usage: %~n0 PDFFILE
  goto end

:error3
  echo.can not find the ghostscript bin file
  echo.   %__gs__%
  echo.please download it from:
  echo.   http://www.ghostscript.com/download/
  echo.and install to "C:\prg\ghostscript"
  goto end

:end
  exit /b
0
commander