![]() |
PDF Dateien, Seitenzahlen ermitteln.
Ich bräuchte einen schnellen Weg um aus diversen PDF-Dateien die reale Seitenzahl zu ermitteln damit ich sie in meinem Programm weiter verarbeiten kann.
Ich nutze derzeit Rad Studio XE (Delphi XE). Gibt es da in Delphi XE bereits ne Komponente oder kennt jemand eine kostenlose Komponente mit der man Zugriff auf solche Informationen hat. Danke im voraus! |
AW: PDF Dateien, Seitenzahlen ermitteln.
ein verwegener Ansatz ....
nach <</Typ/Pages das erste /Count enthält AFAIF die Seitenzahl wobei Leerzeichen entfernt ignoriert werden müssten |
AW: PDF Dateien, Seitenzahlen ermitteln.
Hier sind mal 2 PDF Header einmal x1.4 und einmal x1.6. Das dicke ist jeweils die Seitenanzahl
%PDF-1.4 %âãÏÓ 5724 0 obj<</Linearized 1/L 799637/O 5727/E 47118/N 84/T 685108/H [ 654 2607]>>endobj %PDF-1.6 %âãÏÓ 332 0 obj<</Linearized 1/L 1877963/O 334/E 103049/N 12/T 1877106/H [ 531 351]>>endobj Zitat:
|
AW: PDF Dateien, Seitenzahlen ermitteln.
Die Seiten sind gescannte Bilder und die PDFs sind im Schnitt 90MB groß!
Die Versionen können unterschiedlich sein weil die PDFs aus verschiedenen Quellen stammen bei einer x beliebigen sieht der Header z.B. so aus
Code:
ich will das Rad nicht neu erfinden, es geht nur darum mir die Arbeit zu erleichtern weil ich sonst in jede Datei manuell öffnen muss, die Seitenzahl notieren und in eine Liste eintragen.
%PDF-1.4
1 0 obj <</Type /XObject /Subtype /Image /Name /TI1a /Filter /CCITTFaxDecode /DecodeParms <</K -1 /Columns 2480 /Rows 3507>> /Width 2480 /Height 3507 /BitsPerComponent 1 /ColorSpace /DeviceGray /Length 2 0 R >> stream Ich brauche eine schnelle und zuverlässige Lösung - daher die frage nach einer Komponente oder ähnlichem. :lol: |
AW: PDF Dateien, Seitenzahlen ermitteln.
Such doch mal nach /Mediabox. Es sollte für jede seite einen Eintrag geben.
Gruß K-H |
AW: PDF Dateien, Seitenzahlen ermitteln.
Hallo,
Zitat:
Heiko |
AW: PDF Dateien, Seitenzahlen ermitteln.
Hallo
Such mal nach pdftk ==> Kann bei PDF sehr viel (bestimmt auch die Seitenzahl ermitteln) mfg Reinhold |
AW: PDF Dateien, Seitenzahlen ermitteln.
Zitat:
Man nehme den Sourcecode des PDFTKBuilder von Angus Johnson ( ![]() Die pdftk selbst wird dann nicht benötigt, solange es nur um die Pagecounts geht. |
AW: PDF Dateien, Seitenzahlen ermitteln.
Und Aufpassen mit den Lizenzen. Ich sehe hier öfter mal das als Lizenz GPL verwendet ist. Und GPL kann sehr viral sein.
|
AW: PDF Dateien, Seitenzahlen ermitteln.
Zitat:
|
AW: PDF Dateien, Seitenzahlen ermitteln.
Zitat:
|
AW: PDF Dateien, Seitenzahlen ermitteln.
Zitat:
|
AW: PDF Dateien, Seitenzahlen ermitteln.
Falls das noch jemanden interessiert:
Ich habe mir vor einer Weile mal eine Funktion geschrieben, mit der man ohne jegliche Zusatzkomponenten die Anzahl der Seiten einer PDF-Datei ermitteln kann. Nutze ich jetzt seit Jahren ohne Probleme. Falls es jemand braucht:
Delphi-Quellcode:
// --> Seitenzahl mit Hilfe der Verweise in der PDF-Struktur (Root -> Pages -> Count) ermitteln:
function GetPdfPageCount(pDateiMitPfad: string): integer; var position, AnzVersuche: integer; puffer, pufferTemp, obj, gen: string; PosRichtig: boolean; DateiGroesse: LongInt; function IsNumber(pStr: string): boolean; var i, code: integer; begin val(pStr, i, code); if code <> 0 then result := False else result := True; end; procedure GetObjGen(pPuffer: string; pStartPos: integer; NurObj: boolean); var z: integer; KzFuellen: byte; // --> 1 = Variable "obj" füllen; 2 = Variable "gen" füllen begin KzFuellen := 1; obj := ''; gen := ''; // --> Werte für "obj" und "gen" ermitteln: for z := pStartPos to (pStartPos + 50) do begin if KzFuellen = 2 then begin if IsNumber(pPuffer[z]) then gen := gen + pPuffer[z] else break; end; if KzFuellen = 1 then begin if IsNumber(pPuffer[z]) then obj := obj + pPuffer[z] else KzFuellen := 2; if (KzFuellen = 2) and NurObj then break; end; end; end; begin result := -5; try screen.cursor := crHourglass; // --> Datei einlesen: with TFileStream.Create(pDateiMitPfad, fmOpenRead) do try SetLength(puffer, Size); Read(puffer[1], Size); DateiGroesse := Size; finally Free; end; // --> "Root"-Eintrag suchen, z.B. "/Root 58 0" (58 = obj, 0 = gen): position := pos('/ROOT', AnsiUpperCase(puffer)); if position = 0 then exit; // --> "Root"-Eintrag lesen: GetObjGen(puffer, position + 6, False); // --> Suche beginnen nach Leerzeichen hinter "Root" if (obj = '') or (gen = '') then exit; // --> Abschnitt mit "Pages"-Eintrag suchen: // Da ein Eintrag mehrfach gefunden werden kann (bei der Suche nach "1 0 OBJ" wird z.B. auch die Stelle // "11 0 OBJ" gefunden, usw.), ist die Suche auf max. 100000 Versuche begrenzt. PosRichtig := False; AnzVersuche := 0; pufferTemp := puffer; repeat inc(AnzVersuche); position := pos(obj + ' ' + gen + ' OBJ', AnsiUpperCase(pufferTemp)); if position = 0 then exit; if (position <> 0) and (IsNumber(pufferTemp[position - 1]) = False) then PosRichtig := True; // --> Bereits durchsuchten Bereich am Anfang abschneiden pufferTemp := System.Copy(pufferTemp, position + 8, DateiGroesse); until PosRichtig or (AnzVersuche = 100000); if PosRichtig = False then exit; // --> "Pages"-Eintrag suchen (erster Eintrag im verbliebenen pufferTemp-Bereich): position := pos('/PAGES', AnsiUpperCase(pufferTemp)); if position = 0 then exit; // --> "Pages"-Eintrag lesen: GetObjGen(pufferTemp, position + 7, False); if (obj = '') or (gen = '') then exit; // --> Abschnitt mit "Count"-Eintrag suchen: PosRichtig := False; AnzVersuche := 0; pufferTemp := puffer; repeat inc(AnzVersuche); position := pos(obj + ' ' + gen + ' OBJ', AnsiUpperCase(pufferTemp)); if position = 0 then exit; if (position <> 0) and (IsNumber(pufferTemp[position - 1]) = False) then PosRichtig := True; pufferTemp := System.Copy(pufferTemp, position + 8, DateiGroesse); until PosRichtig or (AnzVersuche = 100000); if PosRichtig = False then exit; // --> "Count"-Eintrag suchen: position := pos('/COUNT', AnsiUpperCase(pufferTemp)); if position = 0 then exit; // --> "Count"-Eintrag lesen: GetObjGen(pufferTemp, position + 7, True); if obj = '' then exit; screen.cursor := crDefault; result := StrToInt(obj); except // --> Hier keine Fehlermeldung ausgeben (result = -5) end; end; |
AW: PDF Dateien, Seitenzahlen ermitteln.
Zitat:
Code entfernt, wegen schlauem Kommentar |
AW: PDF Dateien, Seitenzahlen ermitteln.
Wie wäre es, wenn Du Dich mehr mit aussagekräftigen Bezeichnern auseinandersetzt, anstatt sinnvolle und mächte Programmflusskontrollsequenzen wegzukürzen? ;-)
Clean Code lässt grüßen. :thumb: |
AW: PDF Dateien, Seitenzahlen ermitteln.
Wenn du so schlau bist, dann mach es doch besser.
Clean Code: bezogen auf dummes Geblubber = Fresse halten |
AW: PDF Dateien, Seitenzahlen ermitteln.
@omata:
Natürlich kann man die Funktion auch kürzer schreiben, aber das geht meist nur auf Kosten der Lesbarkeit. Daher ist mir eine "ausführlichere" Variante oftmals lieber... Jeder Programmierer macht das ja eh anders und es gibt sicher auch bessere Lösungswege. (Dein Code würde mich trotzdem auch mal interessieren, konnte ihn nicht mehr lesen...) Aber ich wollte ja auch keinen Preis gewinnen, sondern einfach mal die Idee weitergeben. Ich bin selber immer froh, wenn ich ein Problem lösen will/muss und ich finde ein paar Code-Beispiele in div. Foren. Also keep cool und respektiert Euch alle gegenseitig. Jeder von uns hat's doch auf seine Weise drauf!! 8-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz