Startseite › Foren › PDF24 Creator › Allgemeines › Problem Auslesen Textinhalt eines PDFs
- Dieses Thema hat 3 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 10 Monaten, 3 Wochen von frankatwork.
-
AutorBeiträge
-
2023-06-09 um 8:51 Uhr #17074frankatworkTeilnehmer
Hallo zusammen,
ich habe hier ein echtes Problem mit einer Nachverarbeitung von PDFs aus dem PDF24 Druckertreiber (aber auch aus dem Microsoft PDF-Drucker). Und zwar lese ich PDFs ein und hole mir mit ein ein paar regulären Ausdrücken die Dokument-Inhalte als reinen Text aus dem PDF. Dazu gibt es eine Reihe Bibliotheken im Netz, die ich praktische alle durchprobiert habe.
Im Text suche ich dann nach unserer Lieferschein-Nummer um dann abhängig vom Auftrag weitere Aktionen auszulösen.Dass das grundsätzlich gehen muss zeigt, dass es da verschiedene Bibs gibt, die das mit mehr oder weniger komplexen RegExs machen.
Mit unserem alten FreePDF geht es ja auch. Nur mit PDF24 und aber auch MS-PDF nicht.
<</Length 6 0 R/Filter /FlateDecode>>
stream
....
endstreamDas was zwischen stream und endstream steht muss dann jeweils erst dekomprimiert werden. Normalerweise wohl mit gzuncompress() aber ich habe auch andere Algorithmen versucht. Das Decomprimat wird dann mit weiteren schlauen RegExs in den reinen Text umgewandelt. Und voila ich kann darin meine LS-Nummer suchen.
Bei PDF24 kommt da aber - egal welcher Dekompressionsalgorithmus - nur Knödelkit raus. Ich bin nun leider kein PDF-Spezialist und stehe da auf dem Schlauch.
Hier mal ein Codeschnipsel einer 'einfachen' Bib
function ExtractTextFromPdf ($pdfname)
{
if (strlen ($pdfname) < 1000 && file_exists ($pdfname))
$pdfdata = file_get_contents ($pdfname); //get the data from file
if (!trim ($pdfdata))
echo "Error: there is no PDF data or file to process.";
$result = ''; //this will store the results
//Find all the streams in FlateDecode format (not sure what this is), and then loop through each of them
if (preg_match_all ('/<<[^>]*FlateDecode[^>]*>>\s*stream(.+)endstream/Uis', $pdfdata, $m))
{
foreach ($m[1] as $chunk)
{
$chunk = gzuncompress (ltrim($chunk)); //uncompress the data using the PHP gzuncompress function-> Und was hier raus kommt ist schon unbrauchbar
//If there are [] in the data, then extract all stuff within (), or just extract () from the data directly
$a = preg_match_all ('/\[([^\]]+)\]/', $chunk, $m2) ? $m2[1] : array ($chunk); //get all the stuff within []
foreach ($a as $subchunk)
if (preg_match_all ('/\(([^\)]+)\)/', $subchunk, $m3))
$result .= join ('', $m3[1]); //within ()
//echo $result;
}
}
else
echo "Error: there is no FlateDecode text in this PDF file that I can process.";
return $result; //return what was found
}Hat jemand einen schlauen Rat? Wäre für jede Hilfe dankbar.
Gruß
Frank
2023-06-13 um 7:56 Uhr #17075Stefan ZieglerAdministratorWie man dekomprimiert, steht in /Filter /FlateDecode. Es können aber auch mehrere Filter hintereinander geschaltet sein und es gibt auch Filter für Bilder und Filter mit zusätzlichen Parametern. Können Sie nicht einfach eine andere Software verwenden, die vorher alle Filter im PDF entfernt? QPDF kann das zum Beispiel erledigen.
2023-06-13 um 9:26 Uhr #17076frankatworkTeilnehmerHallo,
vielen Dank für die Info. Nur leider hilft mir das nicht wirklich weiter.
Ich bin nun mal kein PDF-Spezialist. Das Thema ist für mich nur ein Nebenkriegsschauplatz.
Die Infos werden jemanden, der das alles kennt sicher anspringen. Bei mir zirpen nur die Grillen.Diese Extraktionsfunktion nimmt einfach nacheinander alles was zwischen allen stream und endstream steht
und behandelt die einzeln. Egal wieviel streams das sind.
Ob das nun der gesuchte Text, Bild, Fonts, Parameter oder was weiss ich ist spielt für mich eigentlich keine Rolle.
Wenn der gesuchte Text da irgendwo in dem Datenwust vorhanden ist dann findet der Algorithmus den auch.Ich habe wie gesagt verschiedene unterschiedlich komplexe und aufwendige Bibliotheken versucht, die genau das machen (sollten) was ich suche. Aber keiner von denen findet irgendwas. Wenn die das nicht tun läge aus meiner Sicht der Schluss nahe, dass sowohl PDF24 als auch z.B. MS irgendwas anders machen. Möglicherweise wegen neuerer Spezifikationen. Ich habe noch PDFs aus zwei weiteren Quellen getestet. Bei denen funktioniert alles wie es soll.
Mir ist auch nicht ganz klar, was genau ich mit QPDF machen soll.
Vielen Dank
Frank
2023-06-13 um 12:20 Uhr #17078frankatworkTeilnehmerAlso nach einigen Weiteren Nachforschungen habe ich den Grund und die Lösung gefunden.
PDF24 encoded die Textinformationen tatsächlich anders als die, mit denen ich bisher zu tun hatte.
Ich habe noch eine andere Bibliothek gefunden, die das schafft.
Gut, da sind noch Unschärfen bei Umlauten und Sonderzeichen. Aber das stört hier nicht.http://www.phpclasses.org/package/9732-PHP-Extract-text-contents-from-PDF-files.html
https://github.com/christian-vigh-phpclasses/PdfToTextDamit kann ich dann aus allen Formaten den Inhalt auslesen.
Vielen Dank - auch an Christian
Frank
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.