Problem Auslesen Textinhalt eines PDFs

Startseite Foren PDF24 Creator Allgemeines Problem Auslesen Textinhalt eines PDFs

Ansicht von 4 Beiträgen - 1 bis 4 (von insgesamt 4)
  • Autor
    Beiträge
  • #17074
    frankatwork
    Teilnehmer

    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
    ....
    endstream

    Das 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

     

     

    #17075
    Stefan Ziegler
    Administrator

    Wie 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.

    #17076
    frankatwork
    Teilnehmer

    Hallo,

    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

    #17078
    frankatwork
    Teilnehmer

    Also 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/PdfToText

    Damit kann ich dann aus allen Formaten den Inhalt auslesen.

    Vielen Dank - auch an Christian

    Frank

     

Ansicht von 4 Beiträgen - 1 bis 4 (von insgesamt 4)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.