web-dev-qa-db-ger.com

Ist da ein PDF Parser für PHP?

Hallo, ich kenne mehrere PDF Generatoren für PHP (fpdf, dompdf etc.).

Aus Gründen, die ich nicht kontrollieren kann, sind bestimmte Informationen, die ich benötige, nur in einer Tabelle in einem PDF-Dokument enthalten.

Irgendwelche Vorschläge?

41
elviejo79

Ich habe schon einmal einen geschrieben (für ähnliche Bedürfnisse), und ich kann folgendes sagen: Viel Spaß. Das ist eine ziemlich komplexe Aufgabe. Die PDF - Spezifikation ist groß und unhandlich. Es gibt verschiedene Methoden, um Text darin zu speichern. Und der Kicker ist, dass jeder PDF Generator sich in seiner Funktionsweise unterscheidet. Während mit etwas wie TFPDF oder DOMPDF REAL leicht lesbare PDFs (aus Sicht der Maschine) erstellt werden, erstellt Acrobat einige wirklich höllische Dokumente. 

Der Grund ist, wie der Text geschrieben wird. Die meisten DOM-basierten Renderer - die ich verwendet habe - schreiben die gesamte Zeile als eine Zeichenfolge und positionieren sie einmal (was sehr einfach zu lesen ist). Acrobat versucht effizienter zu sein (und dies ist auch der Fall), indem nur ein oder mehrere Zeichen gleichzeitig geschrieben und unabhängig voneinander positioniert werden. Dies vereinfacht zwar WIRKLICH das Rendern, aber das Lesen wird VIEL schwieriger. 

Der Nachteil ist, dass das PDF -Format an sich sehr einfach ist. Sie haben "Objekte", die einer regulären Syntax folgen. Dann können Sie sie miteinander verknüpfen, um den Inhalt zu generieren. Die Spezifikation ist gut geeignet, um das Dateiformat zu beschreiben. Aber das Lesen in der realen Welt wird ein wenig Gehirnleistung erfordern ...

Einige hilfreiche Ratschläge, die ich auf die harte Tour lernen musste, wenn Sie es selbst schreiben würden:

  1. Adobe ordnet Schriften gerne neu zu. Das Zeichen 65 wird also wahrscheinlich nicht A... sein. Sie müssen ein Kartenobjekt finden und ableiten, was es tut. Und es ist effizient, da ein Zeichen, das für diese Schriftart nicht im Dokument angezeigt wird, es nicht enthält (was das Leben schwierig macht, wenn Sie versuchen, eine PDF-Datei programmgesteuert zu bearbeiten) ...
  2. Schreiben Sie es so abstrakt wie möglich. Schreiben Sie Klassen für jeden Objekttyp und jeden nativen Typ (Zeichenfolgen, Zahlen usw.). Lassen Sie diese Klassen für Sie parsen. Es wird eine ganze Reihe von Wiederholungen geben, aber Sie sparen sich am Ende, wenn Sie feststellen, dass Sie etwas nur für einen bestimmten Typ anpassen müssen.
  3. Schreiben Sie für eine oder mehrere Versionen der PDF -Spezifikation und setzen Sie sie durch. Überprüfen Sie die Versionsnummer, und wenn sie höher ist als erwartet, kassieren Sie ... Und versuchen Sie nicht, "es funktionieren zu lassen". Wenn Sie neuere Versionen unterstützen möchten, brechen Sie die Spezifikation heraus und aktualisieren Sie den Parser von dort. Versuchen Sie nicht, Ihren Weg nach oben zu probieren (es macht keinen Spaß) ...
  4. Viel Glück mit komprimierten Streams. Ich habe festgestellt, dass Sie den Längenargumenten normalerweise nicht vertrauen können, um zu überprüfen, was Sie dekomprimieren. Manchmal (für einige Generatoren) funktioniert es gut ... Bei anderen ist es um ein oder mehrere Bytes. Ich versuche es einfach zu entlüften, wenn der Filter passt, und erzwinge dann die Länge ...
  5. Verwenden Sie beim Testen von Längen nicht strlen. Verwenden Sie mb_strlen($string, '8bit'), da dies unterschiedliche Zeichensätze ausgleicht (und möglicherweise ungültige Zeichen in anderen Zeichensätzen zulässt).

Ansonsten viel Glück ...

29
ircmaxell

Ich benutze dafür PDFBox ( http://pdfbox.Apache.org/ ). Diese Software ist javabased und plattformunabhängig. Es funktioniert schnell und zuverlässig. Sie können es per exec oder Shell ausführen oder über eine PHP/Java-Bridge ( http://php-Java-bridge.sourceforge.net/ ) verwenden.

17
Timo

Hast du schon xPDF angeschaut? Es gibt dort ein Programm namens pdftotext, das die Konvertierung durchführt. Sie können es von PHP aus aufrufen und dann die Textversion der PDF-Datei einlesen. Sie müssen die Möglichkeit haben, exec () oder system () von php aus auszuführen, sodass dies möglicherweise nicht für alle gehosteten Lösungen funktioniert. 

Es gibt auch einige Beispiele auf der PHP - Site , die PDF in Text konvertieren, obwohl es ziemlich grob ist. Vielleicht möchten Sie auch einige dieser Beispiele ausprobieren. Suchen Sie auf dieser PHP Seite nach luc bei phpt dot org.

3
ryanday

Schauen Sie sich GhostScript oder ITextSharp an. Es gibt verschiedene plattformübergreifende Versionen von beiden.

1
Mark Redman

Zend_Pdf ist Teil des Zend Framework . Ihr Handbuch besagt:

Die Zend_Pdf-Komponente ist eine PDF-Datei (Portable Document Format) Manipulations-Engine. Es kann geladen werden Dokumente erstellen, ändern und speichern . Somit kann es jeder PHP - Anwendung helfen PDF Dokumente dynamisch erstellen mit vorhandene Dokumente ändern oder Neue von Grund auf neu generieren.

1
Bill Karwin

Es kann sich nicht um eine Tabelle innerhalb von PDF handeln, da der PDF diese Art von Informationen verliert ...

0
mark stephens

Dies ist der Parser PHP PDF, der in zwei Ausführungen existiert:

  1. Kostenlose Version kann PDFs bis zu einem Format PDF parsen. 1.5
  2. Kommerzielles Add-On kann jedes PDF -Format analysieren (bis zu 1.9)
0
lubosdz