Seitennamen von PDF auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
troeten
User
Beiträge: 6
Registriert: Dienstag 26. Juni 2007, 13:18

Hallo,

ich habe hier einige PDF Dateien welche ich zu einer zusammenfügen will, leider sind manche Seiten in verschiedenen PDF-Dateien vorhanden, welche ich aber nicht doppelt haben will.
Nun möchte ich die Seitennamen der Seiten auslesen und vergleichen ob diese schon in meiner neu erstellten PDF vorhanden sind.

Zum auslesen und erstellen der PDFs benutze ich pyPdf.

Hoffe mir kann vlt. jemand helfen.

Viele Grüße

Stefan
Benutzeravatar
noisefloor
User
Beiträge: 3863
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

grundsätzlich sollte das kein Problem sein. Vom Prinzip her solltest du dir überlegen, wie du Dateinamen und Seitennamen am sinnvollsten in eine Liste oder ein Dict schreibst. Wenn du alle Namen hast musst du dir eine kleine Programmlogik überlegen, die aus der Liste oder dem Dict die doppelten eliminiert und basierend auf der bereinigten Liste das neue PDF baut.

Gruß, noisefloor
troeten
User
Beiträge: 6
Registriert: Dienstag 26. Juni 2007, 13:18

Hallo,

erstmal danke für deine antwort.
Wie ich mein Programm aufbauen muss weiß ich schon.
Hab die Frage vlt. falsch gestellt, ich bin auf der Suche nach einer Funktion etc. mit der ich die Seitennamen auslesen kann, so wie es aussieht geht es mit pyPdf nicht.
Irgendwie muss es ja gehen, da sie in meinem PDF-Viewer (Vorschau unter MacOS X) ja auch angezeigt wird.

Gruß Stefan
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Was genau wird denn da angezeigt? Ich kann mir unter "PDF Seitenname" gerade nichts drunter vorstellen.
troeten
User
Beiträge: 6
Registriert: Dienstag 26. Juni 2007, 13:18

Hier mal ein Link zu einer PDF die ich meine
http://wissen.spiegel.de/wissen/image/s ... humb=false

Diese PDF hat zwei Seiten, eine heißt "008.pdf" und die andere "10"
Es ist aber kein Inhaltsverzeichnis.
Benutzeravatar
noisefloor
User
Beiträge: 3863
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Hab die Frage vlt. falsch gestellt, ich bin auf der Suche nach einer Funktion etc. mit der ich die Seitennamen auslesen kann, so wie es aussieht geht es mit pyPdf nicht.
Axo. Da schließe ich mich gkuhl an:
Ich kann mir unter "PDF Seitenname" gerade nichts drunter vorstellen.
Gibt's das? Nie gehört... Bei ReportLab ist das AFAIK nicht bekannt und auch unter Adobe Acrobat unter Windows ist mit beim Bauen von PDF noch nie angeboten worden, Seitennamen zu vergeben. Wenn ich das von dir verlinkte Dokument mit dem Adobe Reader (neuste Version) unter Ubuntu öffne sehe ich auch nirgendwo Seitennamen.

Also: Wo findet man die?

Gruß, noisefloor
troeten
User
Beiträge: 6
Registriert: Dienstag 26. Juni 2007, 13:18

mhh, dachte nich, dass das erklären der Frage schon so schwierig wird :-)

Alos wenn ich die PDF-Datei öffne, habe ich rechts so eine Miniaturansicht der Seiten und unter diesen stehen diese Namen. Es steht nicht explizit Seitennamen dabei, das hab ich so geschrieben, da sie unter den Miniaturansichten der Seiten stehen.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

ich sehe sie, aber in dem Beispiel hiessen die Seiten doch 8 und 10. Was ist aber wenn man nichts vegibt dann beginnt die Nummerierung doch bei 1. d.h. die Seite 1 wirst du in beinahe jedem Dokument finden und dementsprechend diese als doppel erkennen. Besser wäre es doch wenn du den ersten Satz jeder Seite auslesen würdest oder einen Hash generierst aus dem Text der Seite.
Benutzeravatar
noisefloor
User
Beiträge: 3863
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

habe gestern Abend noch gesehen, dass man bei ReportLab zumindest beim Canvas-Objekt ein "Page Lable" setzen kann. Das wird wohl was ähnliches sein. Aber auslesen...?

Ansonsten sehe ich das ähnlich wie DaMutz: Zum definitiven Unterscheiden von PDF-Seiten vllt. ein bisschen Joker... Dann lieber Hash-Werte der ersten X Sätze nehmen. Zumal Text aus ungeschützten PDFs extrahieren ja einfach ist. :-)

Gruß, noisefloor
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ein PDF-Dokument ist im Prinzip eine lesbare Textdatei (öffnet man sie und sieht nur Müll, ist die verschlüsselt oder man schaut auf einen gzip-gepackten `stream`) besteht nach dem Marker `%%PDF-1.X` aus einer Sammlung von Objekten (`obj`... `endobj`) gefolgt von einer Crossreference-Tabelle (`xref`) und einem Trailer dictionary:

Code: Alles auswählen

trailer
<</ID [<b07a3140e9ca13cce2713c06742f9e49><aafcb78f5919819471db3f2d0a07deea>]/Root 4574 0 R/Encrypt 4829 0 R/Size 4831/Info 4830 0 R>>
Dort findet man unter dem Namen `/Root` die Referenz auf den "Document Catalog", ein weiteres dictionary. Bei mir sieht das so aus:

Code: Alles auswählen

4574 0 obj<</Type/Catalog/StructTreeRoot 4158 0 R/Outlines 3757 0 R/Pages 4567 0 R/Names 4575 0 R/Metadata 7 0 R>>
endobj
Dort findet man eine Referenz auf die "Document Outline", was AFAIK das ist, das du suchst. In meinem PDF:

Code: Alles auswählen

3757 0 obj<</Count 12/Type/Outlines/Last 3758 0 R/First 3759 0 R>>
endobj
3759 0 obj<</Parent 3757 0 R/Title(<E1>'ք<88>)/Next 3760 0 R/A 3761 0 R/SE 3762 0 R>>
endobj
...
Jetzt kann ich mit `/Next` und `/First`, wenn es weitere Kinder in der Hierarchie gibt, über alle Objekte der Baumstruktur wandern. Leider ist mir nicht klar, wie die Strings (die in PDF durch Klammern begrenzt werden) dekodiert werden müssen:

Code: Alles auswählen

\xe1'\xd6\x84\x88                     Cover
ZXz\xcd]                              Title
\x14\x1d\xbfD\x06B\x80\xcb\x92,\x95   Credits-TOC
\xbcQ\xf8\x97 t}A                     Foreword
Stefan

Edit: Ich glaube, mein Beispiel-PDF ist verschlüsselt. In einem anderen PDF kann ich's normal lesen.
Antworten