claus ginsel: aus PHP heraus ein PDF bestücken

Moin

ich suche gerade nach einer einfachen Möglichkeit, Formulareingaben (HTML-Formular) in ein PDF zu übernehmen.

Hab da dies gefunden:

Füll die Felder in dem PDF mit Platzhaltern und speicher es als Vorlage. Diese Vorlage kannst du mit z.B. file_get_contents in PHP einlesen und mit str_replace die Platzhalter ersetzen. Wichtig ist dabei nur das die eingesetzten Werte die selbe länge wie die Platzhalter haben. (Platzhalter also relativ lang machen und die Werte mit Leerzeichen auffüllen.)

und hiermit umgesetzt:

$fil=file_get_contents('Test.pdf');

echo $fil;

$fil=str_replace('Mich','XXXX',$fil);
echo '########################################################';
echo $fil;

$datei = fopen('Test2.pdf',"w"); fwrite($datei, $fil); fclose($datei);

Allerdings ist die Ersetzung in Test2.pdf nicht erfolgt. Obwohl in der pdf ein "Mich" steht. In der Ausgabe des Streams finde ich auch kein "Mich". Das erklärt, warum Test2 wie Test aussieht.

Ist die Beschreibung im Zitat falsch oder hab ich was übersehen? Ich muss dazu sagen, dass ich als Test ein PDF ohne Formularfelder genommen hab. Ich dachte, ich könnte einfach beliebigen Text ersetzen.

Gruß Claus

  1. Obwohl in der pdf ein "Mich" steht.

    Siehst Du das "Mich" im PDF-Betrachter oder im Quelltext des PDF?

    1. Obwohl in der pdf ein "Mich" steht.

      Siehst Du das "Mich" im PDF-Betrachter oder im Quelltext des PDF?

      Ach so: Anzeigeprogramme können täuschen. Bei mir geht zum Beipiel less (ein Textanzeiger in der Konsole) offenbar den Umweg über pdftohtml und nutzt dann offenbar noch einen html-Viewer.

  2. Hallo claus,

    Obwohl in der pdf ein "Mich" steht.

    Das weißt Du woher? Zeigt der PDF-Viewer deines Vertrauens das an oder findest Du das in einem Tool, das die PDF-Datei zeichenweise, ohne PDF-Aufbereitung anzeigt? Z.B. ein Hex-Viewer?

    PDFs werden nämlich gerne komprimiert gespeichert, und dann findest Du auf Byte-Ebene (wo str_replace arbeitet) nichts. Zumindest ist mir das gerade in allen PDFs, die ich auf meiner Platte spontan gefunden habe, so gegangen.

    Abgesehen davon ist dein echo $fil; eine heikle Sache. Eine PDF Datei enthält kein HTML Dokument, der Browser erwartet sowas aber (oder hast Du das PDF per Kommandozeile aufgerufen?). Du müsstest $fil also zumindest mit htmlspecialchars aufbereiten, damit der Browser nicht völlig querschießt.

    Wenn Du eine PDF-Datei hast, die auf Binärebene die Zeichenfolge 'M' 'i' 'c' 'h' enthält, dann sollte der von Dir gezeigte Code funktionieren. Von Dateizugriffsfehlern abgesehen. Es kann aber auch rein zufällig sein, dass der Kompressionsalgorithmus die Zeichenfolge Mich als Komprimat erzeugt hat. Und dann generierst Du Müll.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Abgesehen davon ist dein echo $fil; eine heikle Sache. Eine PDF Datei enthält kein HTML Dokument, der Browser erwartet sowas aber (oder hast Du das PDF per Kommandozeile aufgerufen?). Du müsstest $fil also zumindest mit htmlspecialchars aufbereiten, damit der Browser nicht völlig querschießt.

      Oder man sendet den passenden Content-header:

      <?php
      header( 'Content-Type: application/pdf' );
      readfile( '/tmp/test.pdf' );
      

      (Das würde ich wohl vorziehen)

      1. Hallo Raketeninspekteur,

        okay, das hab ich übersehen.

        Vermutlich aus diesen zwei Gründen:

        • Damit schickst Du aber nur ein PDF und nicht den vorher/nachher Vergleich.
        • Ob das PDF komprimiert ist und das "Mich" als Bytefolge gar nicht enthält, siehst Du damit auch nicht.

        Man müsste mal eine Hexdump-Funktion für PHP schreiben. Das hier ist zu primitiv. Eher sowas wie das hier, nur flexibler.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo in die Runde

          Anzeige test2.pdf in adobe "Mich" steht da.

          Anzeige stream dagegen im Browser

          Mit dem echo verband ich die idee, daß die Buchstaben sich dann ja im stream wiederfinden müssten. Rolf, du hast recht, viele nichtdruckbare Zeichen, aber anstandslos ausgegeben durch den browser.

          1. Kann man das selbst festlegen, dass das pdf nicht komprimiert wird?

            1. Hallo claus,

              ich erstelle PDFs nur mit dem PDF Druckertreiber in meinem Computer. Da geht's nicht. Was die Adobe-Tools oder andere PDF Generatoren können, weiß ich nicht.

              Rolf

              --
              sumpsi - posui - obstruxi
  3. Lieber claus,

    ich suche gerade nach einer einfachen Möglichkeit, Formulareingaben (HTML-Formular) in ein PDF zu übernehmen.

    die gibt es nicht. Das ist alles sowas von überhaupt nicht einfach. Hier ist eine Antwort von mir, die ich in der Vergangenheit zu diesem Thema gegeben habe. Vielleicht nützt sie Dir ja ein wenig?

    Liebe Grüße

    Felix Riesterer

    1. Moin Felix

      danke für Deine Anregungen.

      An sich gefällt mir die von mir zitierte Herangehensweise sehr gut, ich würde gern auf zusätzliche Programmpakete verzichten wollen.

      Ich werde also erst einmal versuchen, die von Rolf angesprochene Komprimierung zu händeln oder zu umgehen, je nach dem. Wenn das nix wird, greife ich gern auf deine Erfahrung mit den von Dir benannten Programmpaketen zurück.

      Viele Grüße Claus

      1. Lieber claus,

        An sich gefällt mir die von mir zitierte Herangehensweise sehr gut, ich würde gern auf zusätzliche Programmpakete verzichten wollen.

        es ist eine Frage der Abwägung: Willst Du Schmerzen leiden, weil Du darauf stehst, oder willst Du in absehbarer Zeit eine verlässliche Lösung haben?

        Deine Lust mit dem Hex-Editor in den Eingeweiden eines PDFs herumzustochern geht natürlich total flöten, wenn Du eine Bibliothek einsetzt, die das alles für Dich bequem im Hintergrund erledigt. Da habe ich natürlich kein triftiges Argument gegen.

        Ich werde also erst einmal versuchen, die von Rolf angesprochene Komprimierung zu händeln oder zu umgehen, je nach dem. Wenn das nix wird, greife ich gern auf deine Erfahrung mit den von Dir benannten Programmpaketen zurück.

        Viel Spaß beim Experimentieren! Du wirst auf jeden Fall eine Menge über PDF-Formate dabei lernen. Wenn Du gleich die Bibliothek verwendest, entgeht Dir diese Chance natürlich.

        Liebe Grüße

        Felix Riesterer

        1. Guten Morgen Felix,

          Du wirst auf jeden Fall eine Menge über PDF-Formate dabei lernen.

          will ich doch nicht mehr 😉

          Bin ja erstaunt, wieviel Möglichkeiten es gibt, mit PDF zu hantieren: pdflib, fpdf, tcpdf, pdftk und wahrscheinlich noch andere. Warum muss das Rad mehrfach erfunden werden 😉

          Ein Hinweis zu Deiner Variante:

          Da Du ein HTML-Formular benutzt, könntest Du auf den Umweg über das Template mit fpdi verzichten. Dein Formular müsste vom Layout nur Deiner gewünschten Ausgabe entsprechen. Denn man kann allein mit tcpdf html nach pdf überführen:

          $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
          ...
          $pdf->writeHTML;
          

          LG Claus

  4. ich suche gerade nach einer einfachen Möglichkeit, Formulareingaben (HTML-Formular) in ein PDF zu übernehmen.

    Hab da dies gefunden:

    Füll die Felder in dem PDF mit Platzhaltern und speicher es als Vorlage. Diese Vorlage kannst du mit z.B. file_get_contents in PHP einlesen und mit str_replace die Platzhalter ersetzen. Allerdings ist die Ersetzung in Test2.pdf nicht erfolgt. Obwohl in der pdf ein "Mich" steht. In der Ausgabe des Streams finde ich auch kein "Mich". Das erklärt, warum Test2 wie Test aussieht.

    Stream ist schon ein gutes Stichwort. Wenn Du das so machen möchtest, musst Du die Streams des PDF zunächst dekodieren. Zum Beispiel via mutool.

    1. Moin Mitleser

      Ah Danke Dir, weißt Du was über den verwendeten Algorithmus der Kodierung?

      Gruß Claus

      1. Ah Danke Dir, weißt Du was über den verwendeten Algorithmus der Kodierung?

        Nein. Aber irgendwo hier sollte es stehen ;-)

        1. 👍

          Gruß Claus

  5. Moin nochmal

    also mit dem Tool von Mitleser finde ich im Anschluss im Hexeditor:

    ( )9(M)-3(ich)4(a

    Sieht ja schon nach was aus 😉

    Allerdings das Ersetzen gestaltet sich als schwierig. Ich habe als Such-String einmal 10 Blanks angelegt, und diese ersetzt mit was andrem, danach war das pdf beschädigt 😟

    1. Hallo,

      ( )9(M)-3(ich)4(a

      Sieht ja schon nach was aus 😉

      Ja, nämlich nach einer Kodierung/Komprimierung

      Allerdings das Ersetzen gestaltet sich als schwierig. Ich habe als Such-String einmal 10 Blanks angelegt, und diese ersetzt mit was andrem, danach war das pdf beschädigt 😟

      Sinnvollerweise geht solche Ko***ung geht mit Prüfalgorithmen einher, die simplem Ersetzen natürlich Alarm schlagen...

      Gruß
      Kalk

      1. Moin Kalk Aber warum schreibt er:

        Füll die Felder in dem PDF mit Platzhaltern und speicher es als Vorlage. Diese Vorlage kannst du mit z.B. file_get_contents in PHP einlesen und mit str_replace die Platzhalter ersetzen. Wichtig ist dabei nur das die eingesetzten Werte die selbe länge wie die Platzhalter haben. (Platzhalter also relativ lang machen und die Werte mit Leerzeichen auffüllen.)

        🤔

        1. Hallo claus,

          Aber warum schreibt er:

          Vielleicht weil das Posting alt ist (2013), er ein PDF ohne Komprimierung verwendet hat und gar nicht wusste, dass es auch komprimierte PDFs gibt? Das, was Du da zeigst, sieht nach einer Lauflängencodierung aus.

          ( )9(M)-3(ich)1

          lese ich als "Space", 9 mal. "M", -3 mal. "ich", 1 mal. Wobei mir nicht ganz klar ist, was minus 3 Ms sein sollen. Der Wiederholfaktor hat vielleicht noch Zusatzbedeutungen. Oder die 3 bezieht sich auf die Länge von "ich". Keine Ahnung.

          Die PDFs, die ich hier so habe, enthalten dem Anschein nur Binärzeugs, d.h. außer einer einfachen Lauflängenkodierung könnte man auch höherere Kompressionsalgorithmen vorfinden.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf

            dem ist nicht so, der Text dazu ist

            Hallo Frau Michael ...

            Schau mal hier:

            pdf Reader

            und dazu der Auszug aus dem Hexeditor:

            [(jh)3(g)4(jkg)] TJ

            ...

            [(3)-3(2)7(3)-3(2)] TJ ET BT 1 0 0 1 93.264 735.22 Tm [(_)9(_x)-3(x)9(xx)-3(x)9(__)7(9)-3(8)7(9)] TJ

            Gruß Claus

  6. Hallo nochmal

    warum ich so auf pdf abziele, hat folgenden Hintergrund:

    Derzeit druckt sich unser Klient ein Papier aus, füllt es aus und faxt es uns zu. Dann geht jemand dabei und scannt das Fax ein, um es in die elektronische Akte zu legen.

    Ich wollte das halt abkürzen: online ausfüllen lassen und als pdf auf dem Server ablegen, regelmäßig die pdf abholen und jeweils in die elektronischen Akten legen

    Denkbar wäre aber auch, die online-Eingaben in einer zB Text datei sammeln, downloaden und das pdf daraus lokal erstellen, was würde der Datenschutz dazu sagen?

    Gruß Claus

    1. Hallo claus,

      Klient faxt, euer Fax druckt und ihr scannt es ein? Oh weh. Bei 2-3 Eingängen am Tag ist das hinnehmbar, aber eigentlich ist das die Arbeitsweise von 1999. Es gibt Faxserver (oder Faxprogramme), die das Fax gleich digital empfangen. Sie können es dann als PDF oder Grafikdatei speichern. Oder sofort in eine Datenbank legen. Mit QR- oder Barcode auf dem Formular und einem kleinen Analyseprogramm lässt sich das Fax auch gleich dem richtigen Vorgang zuordnen.

      Für die weiteren Überlegungen ist die Frage, wie heiß ihr auf die Unterschrift seid. Ohne eine solche muss der Kunde ja nicht zwingend ein PDF ausfüllen, drucken und faxen, sondern kann auch ein HTML Formular bekommen. Das wäre dann auch freundlicher für Mobilgeräte machbar, und Du könntest einfache Plausis hinzufügen. Nach Submit generierst Du die Bestätigung als HTML-Seite, die ähnlich wie das Formular aussieht. Damit machst Du diese Dinge:

      (1) An den Browser senden. Der Anwender druckt es sich aus (auf Papier oder mit einem PDF-Druckertreiber als PDF-Datei). Er könnte den Ausdruck unterschreiben und euch zufaxen. Du könntest auch eine Extraseite ausgeben, auf der sich eine Referenznummer und ein Unterschriftenfeld befindet, dann muss der Anwender nur diese Seite unterschreiben und faxen. Das ist gerade dann interessant, wenn das Formular über mehrere Seiten geht.

      (2) Mit einem geeigneten Tool (da gibt's welche, ich kenn nur keine Übersicht) als PDF aufbereiten und speichern. Optional: gleich in die elektronische Akte schieben.

      (3) Optional: Die Daten gleich ins Folgesystem eintragen und eine Arbeitsschwebe für den Sachbearbeiter erzeugen. Wenn das Folgesystem das mitmacht, heißt das.

      Das ist immer ein Kampf mit den Fachbereichen. Da sitzen auch heute noch Betonköpfe, die von den papiergestützten Abläufen nicht wegkommen und nichts daran ändern wollen. Aber wenn man elektronisch, digital, arbeitet, muss man die Prozesse daran anpassen.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Betonköpfe

        überschätzt Du da nicht den einen oder anderen 😂😂😂

        Eine kleine Anekdote von heute: ich soll zu meinen Klienten von extern 1 (in Worten eine) Quote anfordern

        heute bekomm ich das Ergebnis: für einen Klienten mehrere Quoten

        ich frag meine Vorgesetztheit, was tun: "Mittelwert bilden!" 😂😂😂

        1. Hallo claus,

          Fachvorgaben zeichnen sich dadurch aus, Standardbeispiele aufzugreifen und Sonderfälle zu vergessen. Deswegen sollten Fachbereiche dabei immer von Demand- oder Requirement-Spezialisten unterstützt werden. Vor allem, wenn die Programmierer extern sind.

          Denn unser Job als IT-Leistungserbringer ist es nicht, solche Löcher zu finden, sondern erstmal schmunzelnd zu akzeptieren und dann, wenn sie im Test auffallen und berichtigt werden müssen, absurd teure Change Requests einzufordern.

          Bei internen Programmierern klappt das nicht so gut…

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Bei internen Programmierern klappt das nicht so gut

            die laufen eher Gefahr, dass deren kritischer Einwand als Arbeitsverweigerung ausgelegt wird.

            Nicht mal unser Intranet ist stabil, meine umfangreiche Antwort auf dein Statement ist im Nirvana gelandet. 😩

            Ich mach Feierabend, Dir / Euch auch einen schönen

            Gruß Claus

  7. Moin

    werde doch auf eine externe Klasse setzen. Hab mich für tcpdf entschieden, da man dort direkt HTML-Code in PDF konvertieren kann.

    Besten Dank für Eure Hinweise

    Gruß Claus