AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi PDF Dateien, Seitenzahlen ermitteln.
Thema durchsuchen
Ansicht
Themen-Optionen

PDF Dateien, Seitenzahlen ermitteln.

Ein Thema von Andreas2k · begonnen am 18. Okt 2011 · letzter Beitrag vom 10. Jul 2012
Antwort Antwort
Benutzerbild von rweinzierl
rweinzierl

Registriert seit: 22. Mär 2005
98 Beiträge
 
#1

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 19. Okt 2011, 09:30
Hallo

Such mal nach

pdftk


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

mfg

Reinhold
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 19. Okt 2011, 13:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.213 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 19. Okt 2011, 13:41
Und Aufpassen mit den Lizenzen. Ich sehe hier öfter mal das als Lizenz GPL verwendet ist. Und GPL kann sehr viral sein.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 19. Okt 2011, 14:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.213 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 19. Okt 2011, 14:35
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 ...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Andreas2k

Registriert seit: 2. Jan 2003
108 Beiträge
 
Delphi XE5 Professional
 
#6

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 19. Okt 2011, 14:59
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 ...
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.
Andreas
  Mit Zitat antworten Zitat
Branco Wassmuth

Registriert seit: 25. Jun 2012
2 Beiträge
 
#7

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 25. Jun 2012, 08:37
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;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 9. Jul 2012, 00:33
Falls das noch jemanden interessiert...
Hier mal eine Überarbeitung, ohne exit, break, with und globale Variablen.

Code entfernt, wegen schlauem Kommentar

Geändert von omata ( 9. Jul 2012 um 07:33 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: PDF Dateien, Seitenzahlen ermitteln.

  Alt 9. Jul 2012, 07:23
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.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 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 by Thomas Breitkreuz