Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PDF Dateien, Seitenzahlen ermitteln. (https://www.delphipraxis.net/163836-pdf-dateien-seitenzahlen-ermitteln.html)

Andreas2k 18. Okt 2011 14:19

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!

Bummi 18. Okt 2011 14:24

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

Darlo 18. Okt 2011 14:43

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:

Zitat von Bummi (Beitrag 1131052)
ein verwegener Ansatz ....
nach <</Typ/Pages
das erste /Count enthält AFAIF die Seitenzahl
wobei Leerzeichen entfernt ignoriert werden müssten

/Typ/Pages habe ich in den PDFs garnicht gefunden:?:

Andreas2k 18. Okt 2011 15:22

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:
%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 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.

Ich brauche eine schnelle und zuverlässige Lösung - daher die frage nach einer Komponente oder ähnlichem. :lol:

p80286 18. Okt 2011 16:18

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Such doch mal nach /Mediabox. Es sollte für jede seite einen Eintrag geben.

Gruß
K-H

hoika 18. Okt 2011 18:25

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Hallo,

Zitat:

ich will das Rad nicht neu erfinden
Dann sollte dir das etwas Wert sein und du dir QuickPDF kaufen.


Heiko

rweinzierl 19. Okt 2011 08:30

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Hallo

Such mal nach

pdftk


==> Kann bei PDF sehr viel (bestimmt auch die Seitenzahl ermitteln)

mfg

Reinhold

ASM 19. Okt 2011 12:25

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Zitat:

Zitat von rweinzierl (Beitrag 1131191)
Such mal nach

pdftk


==> Kann bei PDF sehr viel (bestimmt auch die Seitenzahl ermitteln)


Man nehme den Sourcecode des PDFTKBuilder von Angus Johnson (http://angusj.com/pdftkb/), verwende daraus die zur Ermittlung der Pagecounts benötigten Funktionen (GetPdfPageCount() und ReversePngFilter()). Außerdem braucht man die zlib.
Die pdftk selbst wird dann nicht benötigt, solange es nur um die Pagecounts geht.

Bernhard Geyer 19. Okt 2011 12:41

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.

ASM 19. Okt 2011 13:29

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1131253)
Und Aufpassen mit den Lizenzen. Ich sehe hier öfter mal das als Lizenz GPL verwendet ist. Und GPL kann sehr viral sein.

Zur Nutzung für den eigenen, privaten Gebrauch wird es auf Grund der GPL-Lizenz, unter der Angus den Code freigegeben hat, jedoch keine "viralen" Probleme geben.

Bernhard Geyer 19. Okt 2011 13:35

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Zitat:

Zitat von ASM (Beitrag 1131262)
Zur Nutzung für den eigenen, privaten Gebrauch wird es auf Grund der GPL-Lizenz, unter der Angus den Code freigegeben hat, jedoch keine "viralen" Probleme geben.

Ob der Thread-Ersteller den gleichen Einsatzfall hat ... :gruebel:

Andreas2k 19. Okt 2011 13:59

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1131263)
Zitat:

Zitat von ASM (Beitrag 1131262)
Zur Nutzung für den eigenen, privaten Gebrauch wird es auf Grund der GPL-Lizenz, unter der Angus den Code freigegeben hat, jedoch keine "viralen" Probleme geben.

Ob der Thread-Ersteller den gleichen Einsatzfall hat ... :gruebel:

Es geht nur um eine für mich, also private, Nutzung. Es ist also kein Programm zum verkauf oder ähnliches. Es soll mir nur intern die Arbeit erleichtern.

Branco Wassmuth 25. Jun 2012 07:37

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;

omata 8. Jul 2012 23:33

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Zitat:

Zitat von Branco Wassmuth (Beitrag 1172258)
Falls das noch jemanden interessiert...

Hier mal eine Überarbeitung, ohne exit, break, with und globale Variablen.

Code entfernt, wegen schlauem Kommentar

Furtbichler 9. Jul 2012 06:23

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:

omata 9. Jul 2012 06:34

AW: PDF Dateien, Seitenzahlen ermitteln.
 
Wenn du so schlau bist, dann mach es doch besser.

Clean Code: bezogen auf dummes Geblubber = Fresse halten

Branco Wassmuth 10. Jul 2012 18:27

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 12:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz