Abrufen von Seitenzahlen aus dem Dokument mit pyPDF

8

Im Moment suche ich nach einer PDF-Zusammenführung mit pyPdf, aber manchmal sind die Eingaben nicht in der richtigen Reihenfolge, also schaue ich auf jede Seite nach ihrer Seitenzahl, um die Reihenfolge zu bestimmen, in die sie gehen soll (zB wenn jemand ein Buch in 20 10-seitige PDFs aufteilt und ich möchte sie wieder zusammenfügen).

Ich habe zwei Fragen - 1.) Ich weiß, dass manchmal die Seitennummer irgendwo in den Dokumentendaten gespeichert wird, da ich PDFs gesehen habe, die auf Adobe als etwas wie [1243] (10 von 150) darstellen, aber ich habe Dokumente dieser Art in pyPDF gelesen und kann keine Informationen finden, die die Seitenzahl angeben - wo ist das gespeichert?

2. Wenn die erste Möglichkeit # 1 nicht verfügbar ist, denke ich, dass ich durch die Objekte auf einer bestimmten Seite iterieren kann, um eine Seitenzahl zu finden - wahrscheinlich wäre es ein eigenes Objekt, das eine einzelne Zahl enthält. Ich kann jedoch keinen klaren Weg finden, den Inhalt von Objekten zu bestimmen. Wenn ich renne:

%Vor%

Dies wird normalerweise entweder zurückgegeben:

%Vor%

oder gibt eine Liste von IndirectObject (num, num) -Objekten zurück. Ich weiß nicht wirklich, was ich mit diesen beiden tun soll, und es gibt keine wirkliche Dokumentation darüber, soweit ich das beurteilen kann. Kennt jemand diese Art von Dingen, die mich in die richtige Richtung weisen könnten?

    
SquidneyPoitier 10.09.2012, 23:59
quelle

4 Antworten

6

Eine vollständige Dokumentation finden Sie auf der 978-seitigen PDF-Referenz von Adobe. : -)

Genauer gesagt enthält die PDF-Datei Metadaten, die angeben, wie die physischen Seiten der PDF-Dateien den logischen Seitenzahlen zugeordnet sind und wie Seitenzahlen formatiert werden sollen. Hier geht es um kanonische Ergebnisse. Beispiel 2 dieser Seite zeigt, wie dies im PDF-Markup aussieht. Sie müssen das herausfischen, analysieren und selbst ein Mapping durchführen.

Um diese Informationen zu erhalten, versuchen Sie in PyPDF als Ausgangspunkt:

%Vor%

Wenn Sie eine IndirectObject -Instanz sehen, können Sie übrigens ihre getObject() -Methode aufrufen, um das tatsächliche Objekt abzurufen, auf das gezeigt wird.

Ihre Alternative besteht darin, wie Sie sagen, die Textobjekte zu überprüfen und herauszufinden, welche die Seitennummer ist. Sie könnten extractText() des Seitenobjekts dafür verwenden, aber Sie erhalten eine Zeichenfolge zurück und müssen versuchen, die Seitenzahl daraus herauszufischen. (Und natürlich kann die Seitennummer römisch oder alphabetisch statt numerisch sein, und einige Seiten dürfen nicht nummeriert sein.) Schauen Sie sich stattdessen an, wie extractText() tatsächlich ihren Job erledigt - PyPDF wird schließlich in Python geschrieben - und Verwenden Sie es als Grundlage für eine Routine, die jedes Textobjekt auf der Seite einzeln überprüft, um festzustellen, ob es sich um eine Seitennummer handelt. Seien Sie vorsichtig bei Inhaltsverzeichnissen / Indexseiten, die viele Seitennummern enthalten!

    
kindall 11.09.2012, 15:36
quelle
15

Folgendes funktionierte für mich:

%Vor%     
Josh 29.07.2013 18:14
quelle
2

Die Antwort von kindall ist sehr gut. Da jedoch später (von Träumer) ein funktionierendes Codebeispiel angefordert wurde und ich heute das gleiche Problem hatte, möchte ich einige Anmerkungen hinzufügen.

  1. pdf Struktur ist nicht einheitlich; Es gibt nur wenige Dinge, auf die Sie sich verlassen können, daher ist es sehr unwahrscheinlich, dass ein funktionierendes Codebeispiel für jeden funktioniert. Eine sehr gute Erklärung finden Sie in dieser Antwort .

  2. Wie schon von kindall erklärt, werden Sie sehr wahrscheinlich herausfinden müssen, mit welchem ​​PDF Sie es zu tun haben.

Wie so:

%Vor%
  1. Wie Sie der ISO pdf 1.7-Spezifikation entnehmen können (relevanter Abschnitt hier ), gibt es viele Möglichkeiten, Seiten zu beschriften . Als ein einfaches Arbeitsbeispiel betrachten Sie dieses Skript, das sich mindestens mit Dezimal (arabisch) und mit römischen Zahlen befassen wird:

Skript:

%Vor%     
0range 01.03.2016 17:04
quelle
1

Die anderen Antworten verwenden PyPDF / PyPDF2, das die gesamte Datei zu lesen scheint. Dies dauert bei großen Dateien lange.

In der Zwischenzeit habe ich etwas schnell und dreckig geschrieben, was nicht annähernd so lange dauert. Es führt einen Shell-Call durch, aber ich wusste nichts anderes. Es kann die Anzahl der Seiten für PDFs, die ~ 5000 Seiten sind, sehr schnell erhalten.

Es funktioniert, indem Sie einfach den Shell-Befehl "pdfinfo" aufrufen, also funktioniert es wahrscheinlich nur unter Linux. Ich habe es bisher nur auf ubuntu getestet.

Ein merkwürdiges Verhalten, das ich gesehen habe, ist, dass das umgebende dies in einem try / except-Block keine Fehler findet, außer subprocess.CalledProcessError.

%Vor%     
Bryant Kou 07.11.2017 23:55
quelle

Tags und Links