PDF Information auslesen?

Rund um die LCL und andere Komponenten
Antworten
bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

PDF Information auslesen?

Beitrag von bembulak »

Hallo Leute,

ich bastel gerade ein kleines Werkzeug, das uns hier im Büro die Arbeit ein klein wenig erleichtern soll.
Dazu müsste ich allerdings Informationen aus PDF Dateien auslesen. Alle PDFs haben nur eine Seite und ich bräuchte von dieser Seite das Papierformat und andere Metadaten. Ich muss also nicht mal auf den "Inhalt der Datei" zugreifen.

Kennt jemand zufällig eine Komponente oder ein Package, welches in der Lage ist, das zu bewerkstelligen?
Ich habe schon einige Schlagwörter auf die Suchmaschinen losgelassen, bin aber nicht fündig geworden.

Für jeden Hinweis dankbar,

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: PDF Information auslesen?

Beitrag von theo »

bembulak hat geschrieben:Für jeden Hinweis dankbar,


Auf Linux löst man sowas gerne mit einem externen Programm. z.B. mit den "poppler-tools"

Code: Alles auswählen

>pdfinfo ~/Dokumente/DE_2005.pdf
 
Title:          Media_Heft_2006
Author:         Sponner
Creator:        QuarkXPress Passport™: AdobePS 8.8.0 (301)
Producer:       Acrobat Distiller 6.0.0 for Macintosh
CreationDate:   Mon Jul 31 07:05:01 2006
ModDate:        Mon Jul 31 07:15:52 2006
Tagged:         no
Pages:          16
Encrypted:      no
Page size:      595.276 x 841.89 pts (A4)
File size:      306181 bytes
Optimized:      yes
PDF version:    1.5

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: PDF Information auslesen?

Beitrag von gocher »

Am besten sucht man im MemoryStream nach /MediaBox [ 0 0 596 842 ] das ist die Seitengröße im Beispiel A4!

Mal eben kurz und schmutzig hin programmiert :shock: aber es klappt zumindest mit meinen getesteten 5 PDF Dateien :mrgreen: !

Code: Alles auswählen

function GetMediaBox(const Stream: TMemoryStream): string;
var
  What: RawByteString;
  aPtr: PChar;
  len, i: Int64;
begin
  Result := '';
  What := '/MediaBox [';
  Stream.Seek(0, soFromBeginning);
  len := Length(What);
  i := 0;
  while Stream.Position+len < Stream.Size do
  begin
    aPtr := Stream.Memory;
    inc(aPtr, Stream.Position);
    if CompareMem(aPtr, PChar(What), Length(What)) then
    begin
      SetString(Result, aPtr, 50);
      Result := Copy(Result, 1, Pos(']', Result));
      Exit;
    end;
    inc(i);
    Stream.Seek(i,0)
  end;
end;
 
var
  Stream: TMemoryStream;
  s: string;         
begin
  Stream := TMemoryStream.Create();
  Stream.LoadFromFile('c:\test.pdf');
  s := GetMediaBox(Stream);
  WriteLn(s);
  Stream.Free;
end;

Ach so da fällt mir noch ein, wenn Du die Werte in Millimeter brauchst einfach mal 0.3527 rechnen!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Re: PDF Information auslesen?

Beitrag von bembulak »

Auf Linux löst man sowas gerne mit einem externen Programm. z.B. mit den "poppler-tools"

Sowas hatte ich auch schon überlegt, aber mit poppler sieht's unter Windows nicht so gut aus. Ausserdem wollte ich das Aufrufen externer Prozesse sparen. Danke trotzdem.


Neuer Beitragvon gocher » Do 5. Jul 2012, 21:56 Re: PDF Information auslesen?
Am besten sucht man im MemoryStream nach /MediaBox [ 0 0 596 842 ] das ist die Seitengröße im Beispiel A4!

Von der 'MediaBox' hatte ich schon gelesen, meine Ergebnisse waren aber alles andere als zufriedenstellend. Deine Lösung funktioniert aber hier bei mir, ich musste nur den RawByteString durch einen AnsiString ersetzen. Das hat hier nicht funktioniert - ich nehme an, es liegt an meiner FPC Version.

Danke, ich nehme an, das dürfte so nun funktionieren. Ich teste das jetzt mal mit unseren Dokumenten (die teilweise als Druckvorlagen dienen und daher ganz komische Größen aufweisen).

Danke!

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: PDF Information auslesen?

Beitrag von gocher »

bembulak hat geschrieben: ich musste nur den RawByteString durch einen AnsiString ersetzen. Das hat hier nicht funktioniert - ich nehme an, es liegt an meiner FPC Version.


RawByteString ist definiert in fpc/rtl/inc/systemh.inc seit dem 17. September 2011 (FPC Revision:19099)
aber AnsiString macht in diesem Fall keinen Unterschied!

Code: Alles auswählen

{$ifdef FPC_HAS_CPSTRING}
  RawByteString       = type AnsiString(CP_NONE);
{$else FPC_HAS_CPSTRING}
  RawByteString       = ansistring;
{$endif FPC_HAS_CPSTRING}
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

bembulak
Beiträge: 370
Registriert: Di 6. Feb 2007, 09:29
OS, Lazarus, FPC: L0.9.29 SVN:24607 FPC 2.4.0-32 bit @ Win XP SP3
CPU-Target: 32bit i386, ARM
Wohnort: Oberösterreich

Re: PDF Information auslesen?

Beitrag von bembulak »

... aber AnsiString macht in diesem Fall keinen Unterschied!

Gut, dann bin ich mal froh, dass ich hier das offenbar Richtige gemacht habe.

Mein Problem ist jetzt eigentlich nur, dass manche PDFs einfach nicht erkannt werden. PDFs aus LibreOffice scheinen teilweise kein "\MediaBox" Tag zu haben und auch die hauseigenen Illustrator-PDFs funktionieren nur teilweise, bzw. dauert es ziemlich lange, diese riesen-PDFs auszulesen.
Ich muss mir das noch ein wenig ansehen und hoffe, noch eine Lösung finden zu können.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: PDF Information auslesen?

Beitrag von gocher »

Ich würde als Alternative auch noch nach '/CropBox' suchen, dann bist Du sicherlich wieder ein Stück weiter!
Bild
Zuletzt geändert von gocher am Mo 9. Jul 2012, 21:34, insgesamt 1-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: PDF Information auslesen?

Beitrag von Bora4d »

Schaumal hier vielleicht ist das für dich gut:
http://www.lazarus.freepascal.org/index.php/topic,17192.0.html

Da hat jemand ein Pdf-Bibliothek erstellt.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: PDF Information auslesen?

Beitrag von theo »

Bora4d hat geschrieben:Schaumal hier vielleicht ist das für dich gut:
http://www.lazarus.freepascal.org/index.php/topic,17192.0.html

Da hat jemand ein Pdf-Bibliothek erstellt.


Ich glaube das ist nur zum schreiben, nicht zum lesen von PDF.

Nils_S
Beiträge: 1
Registriert: Do 18. Apr 2013, 10:34

Re: PDF Information auslesen?

Beitrag von Nils_S »

Danke für die Anleitung. Arbeite aber immer mit dem PDF-Xchange Tool.
Hat ne Menge mehr freie Funktionen als der Adobe: http://www.pdf-xchange.de/pdf-xchange-v ... worten.htm

Antworten