Henry: PDF erzeugen mit PHP

Hallo,

ich habe immer noch das Problem eine geeignete Lösung zu finden, wie ich flexibel und unkompliziert PDF aus HTML erzeugen kann.

Nachdem ich nun schon so ziemlich alle bekannten Lösungen angeschaut habe, viele sind veraltet, denke ich die beste Lösung wäre eine zentral auf einem Server gelegene Anwendung die das bewerkstelligt, ähnlich dem hier. Jetzt könnte ich natürlich auch das genannte nutzen, doch meine Daten beim fremden Anbieter, bestimmt nicht. Nun gibts ja auch einige Tools, sogar kostenlos, die das wohl auch bewerkstelligen könnten doch leider alle in Kombi mit diesem unsäglichen Composer und den damit verbunden Abhängigkeiten.

Bevor ich mich nun auf die Reise begebe einen geigneten Programmierer zu finden, der das für mich aufsetzen kann, frage ich doch mal lieber hier an, ob es vieleicht doch eine einfachere Löung gibt, die mir bisher entgangen ist oder ob jemand hier Interesse hat mir das zu erstellen, also eine transportable Variante ohne Composer oder sonstwas in der Richtung. Bin natürlich bereit dafür zu bezahlen und/oder alternativ dem Verein hier eine Spende dafür zukommen zu lassen.

Ziele:

  • Dass ich lediglich eine URL angeben muss um daraus(aus einfachem HTML mit CSS) bevorzugt durch PHP ein PDF zu erstellen, das Resultat sollte visuell möglichst nah am Original sein.

  • Dazu eine Option PDF zu mischen, will sagen mehrere PDF als URL angeben und diese als einzelnes PDF raus bekommen.

  • Sollte auch mit grösseren Dateien umgehen können und nicht den Server in die Knie zwingen.

  • Bulkoption

  • Optional eventuell PDF Passwortschutz

Gewünschte Hardware/Server stelle ich natürlich selbst.

Würde mich über ein faires Angebot freuen, öffentlich oder per PM.

Gruss
Henry

--
Meine Meinung zu DSGVO & Co:
„Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
  1. Hallo Admins,

    *nur zur Info.

    hatte gerade bei diesem Thread ein Problem. Konnte nicht posten, weil ich angeblich zu viele Tags hatte, durfte nur drei und hatte auch nur 3 siehe Screenshot. Ging erst als ich nur zwei nahm. Bzw. sehe gerade, dass "Jobangebot" oben zweimal als Tag genommen wird, warum auch immer.

    Gruss
    Henry

    --
    Meine Meinung zu DSGVO & Co:
    „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
  2. Lieber Henry,

    Jeder ist seines Glückes Schmied. Oder seiner Hölle Architekt. Ganz wie belieben.

    Auch alles Weitere hat sich offensichtlich nicht geändert.

    Liebe Grüße

    Felix Riesterer

  3. Hallo,

    nachdem offensichtlich hier keiner Lust/Möglichkeiten hat das umzusetzen, habe ich mir nun ein externes Angebot eingeholt. Fällt zwar mit 1200 Euro etwas teurer aus als gehofft, werde es aber wohl annehmen müssen oder mich doch mit Composer beschäftigen (glaube ich aber eher nicht).

    Gruss
    Henry

    --
    Meine Meinung zu DSGVO & Co:
    „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
    1. Fällt zwar mit 1200 Euro etwas teurer aus als gehofft

      Was hast Du denn erwartet (Zeitaufwand, Stundensatz)?

      MFG

    2. Aloha ;)

      Fällt zwar mit 1200 Euro etwas teurer aus als gehofft, werde es aber wohl annehmen müssen

      Echt? Ich hätte mit mehr gerechnet. Da würde ich an deiner Stelle ganz genau ins Pflichtenheft schauen.

      Das, was du haben möchtest, ist in seiner Universalität nur sehr schwer umzusetzen. Beliebiges HTML möglichst so in einer PDF darstellen, wie wenns im Browser wäre.

      Das ist eine erhebliche Aufgabe. Ich kann mir nicht vorstellen, wie sowas mit 1200€ Einsatz programmiert werden sollte, ohne, dass da gravierende Einschränkungen gemacht werden.

      Nur meine Einschätzung.

      Grüße,

      RIDER

      --
      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
      # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
      1. Hallo Camping_RIDER,

        Das, was du haben möchtest, ist in seiner Universalität nur sehr schwer umzusetzen.

        https://wkhtmltopdf.org/

        Freundliche Grüße,
        Christian Kruse

  4. 1200 Euro?

    Das ist entweder zu billig - oder zu teuer.

    Zu teuer?

    https://www.booleanworld.com/take-screenshots-webpages-command-line/

    Das Bild kann man dann durch imagick jagen (dabei auch das "Wasserzeichen" einfügen und jede Menge weiterer Kunststücke ausführen und am Ende ein PDF daraus erzeugen.

    Auch für das Zusammenfügen von PDFs gibt es mannigfaltige Möglichkeiten, die als (Sub-)Shell-Befehle zu integrieren keine große Aufgabe ist.

    Nachteil: Du hast an Ende ein PDF mit einer Grafik pro Seite drin, was „irgendie nicht ganz der Sinn eines PDF ist“.

    Zu billig?

    Ja. Ich müsste wohl erst zu Dir fahren und herausbekommen, was Du wirklich willst. Und ja, ich würde erwarten, dass dieser Aufwand nicht schlechter als ein Seminartag bezahlt wird. Die Angaben, die ich gefunden habe, sind löchrig, allgemein und schwammig. Ich weiß z.B. nichts über die Herkunft der anderen PDFs und der HTML-Dateien und WARUM Du eigentlich HTML in PDFs umwandeln willst.

    Grund: Wenn man an dieser Stelle eine bessere Lösung findet (Ich hab schon ein paar Mal erwähnt, dass ICH das mit LaTeX machen würde, Vorlagen z.B. aus Libreoffice als tex exportieren und dann manuell anpassen ... statt erst HTML zu erzeugen), dann ist man auf Dauer auch besser bedient. Wenn also die Antwort auf die Frage nach der Herkunft der HTML-Dateien darauf hinausläuft, dass diese, quasi als Seriendokumente, extra erzeugt werden um dann in PDFs umgewandelt zu werden, dann sollte man mit Dir ein wenig schimpfen dürfen, weil genau das auf meinem Weg sehr viel besser (Rechenzeit, Performance und Ergebnis!) und einfacher geht.

    1. Das Programm pageres erzeugt genau genommen Screenshots, die mit einem headless (Keine Anzeige!) gestarteten Chrome aufgenommen werden.

      So sieht das Ergebnis von

      pageres https://www.google.com 800x1200
      

      aus:

      Bildschirmfoto mit „pageres https://www.google.com 800x1200“ geschossen

      1. Hallo Raketenportabledokumenterzeuger,

        Das Programm pageres erzeugt genau genommen Screenshots,

        Also erhält man ein PDF-Dokument, in dem man keinen Text markieren kann? Das ist oft nicht sinnvoll.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
        1. Also erhält man ein PDF-Dokument, in dem man keinen Text markieren kann? Das ist oft nicht sinnvoll.

          Genau das. Und zudem eines, welches als Datei in einer Vielzahl von Fällen viel zu viel Platz braucht.

          Dafür ist das HTML und das CSS bestens gerendert. Das macht ja ein echter Browser…

    2. Servus!

      Grund: Wenn man an dieser Stelle eine bessere Lösung findet (Ich hab schon ein paar Mal erwähnt, dass ICH das mit LaTeX machen würde, Vorlagen z.B. aus Libreoffice als tex exportieren und dann manuell anpassen ... statt erst HTML zu erzeugen), dann ist man auf Dauer auch besser bedient.

      Ich kenne jemanden, der eine technische Dokumentation in LaTeX geschrieben hat und diese als PDF exportiert und veröffentlicht UND mit einem selbstgebastelten Python-Script in HTML umwandelt.

      Wäre dieser Ansatz etwas?

      Herzliche Grüße

      Matthias Scharwies

      --
      25 Jahre SELFHTML → SELF-Treffen 05.-07. Juni 2020 in Mannheim
      1. Ich kenne jemanden, der eine technische Dokumentation in LaTeX geschrieben hat und diese als PDF exportiert und veröffentlicht UND mit einem selbstgebastelten Python-Script in HTML umwandelt.

        • htlatex dürfte dafür in vielen Fällen genügen.
    3. WARUM Du eigentlich HTML in PDFs umwandeln willst.

      (Ich hab schon ein paar Mal erwähnt, dass ICH das mit LaTeX machen würde, Vorlagen z.B. aus Libreoffice als tex exportieren und dann manuell anpassen ...)

      Hier mal die Vorlage (template) mit Platzhaltern: (vorlage.tex)

      \documentclass{article}
      \usepackage{geometry}
      \geometry{a4paper, top=15mm, left=25mm, right=25mm, bottom=30mm,
      headsep=10mm, footskip=12mm}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \usepackage[ngerman]{babel}
      \usepackage{amsmath}
      \usepackage{amssymb,amsfonts,textcomp}
      \usepackage{array}
      \usepackage{supertabular}
      \usepackage{hhline}
      \usepackage{ulem}
      \makeatletter
      \newcommand\arraybslash{\let\\\@arraycr}
      \makeatother
      \setlength\tabcolsep{1mm}
      \renewcommand\arraystretch{1.3}
      \renewcommand{\familydefault}{\sfdefault}
      \usepackage{helvet}
      \thispagestyle{empty}
      \title{Rechnung D.RNUMMER vom D.DATUM}
      \begin{document}
      \large{}
      \begin{tabbing}
      \hspace{11cm}
      D.ABSENDER.VORNAME D.ABSENDER.NACHNAME\\
      \hspace{11cm}
      D.ABSENDER.STRASSE\\
      \hspace{11cm}
      D.ABSENDER.PLZ D.ABSENDER.ORT\\\\
      \bigskip
      \hspace{11cm}
      Steuernummer D.ABSENDER.STEUERNUMMER\\
      \hspace{11cm}
      (FA D.ABSENDER.ORT)\\
      \hspace{11cm}
      Rechnungsnummer D.RNUMMER\\
      \hspace{11cm}
      D.ABSENDER.ORT, am D.DATUM
      \end{tabbing}
      \small{\uline{D.ABSENDER.VORNAME D.ABSENDER.NACHNAME, D.ABSENDER.STRASSE, D.ABSENDER.PLZ D.ABSENDER.ORT}}
      \large{}
      \bigskip\\
      D.ADDR.FIRMA\\
      D.ADDR.PERSON\bigskip\\
      D.ADDR.STRASSE\\
      D.ADDR.PLZ D.ADDR.ORT\bigskip\\
      \bigskip\\
      \textbf{Rechnung für Dienstleistungen}
      \bigskip\\
      %\begin{center}
      \tablehead{}
      \begin{supertabular}{|m{9cm}m{2.5cm}|m{2.5cm}|}
      \hline
      \multicolumn{1}{|m{10.597cm}|}{\textbf{Leistung}} &
      \textbf{Termin} &
      \textbf{Betrag}\\
      \hline
      \multicolumn{1}{|m{10.597cm}|}{
      \bigskip
      D.LEISTUNG.1\newline
      D.LEISTUNG.2\newline
      D.LEISTUNG.3\newline
      D.LEISTUNG.4
      ~
      } &
      \bigskip
      D.T.1\newline
      D.T.2\newline
      D.T.3
      &
      \raggedleft\arraybslash D.NETTO\\
      \hline
      \multicolumn{2}{|m{8cm}|}{\textbf{Summe:}} &
      \raggedleft\arraybslash \textbf{D.NETTO}\\
      \hline
      \multicolumn{2}{|m{8cm}|}{\textbf{Umsatzsteuer:} (D.USTSATZ\%)} &
      \raggedleft\arraybslash D.UST\\
      \hline
      \multicolumn{2}{|m{8cm}|}{\textbf{Gesamt:}} &
      \raggedleft\arraybslash \textbf{D.BRUTTO}\\\hline
      \end{supertabular}
      %\end{center}
      \bigskip\\
      Ich bitte um Überweisung des Betrages von D.BRUTTO~unter Angabe der Rechnungsnummer D.RNUMMER auf mein Konto:
      \bigskip
      \begin{center}
      \tablehead{}
      \begin{supertabular}{m{2.259cm}m{0.2cm}m{10.908cm}}
      \raggedleft Konto-Nr.:&~&D.KONTONR\\
      \raggedleft Inhaber:&~&D.ABSENDER.VORNAME D.ABSENDER.NACHNAME\\
      \raggedleft BLZ:&~&D.BANKLEITZAHL (D.BANK.NAME)\\
      \raggedleft IBAN:&~&D.BANK.IBAN\\
      \raggedleft BIC:&~&D.BANK.BIC\\
      \end{supertabular}
      \end{center}
      \bigskip
      \bigskip
      Mit freundlichen Grüßen
      \bigskip\\
      D.ABSENDER.VORNAME D.ABSENDER.NACHNAME\\
      D.ABSENDER.ORT, am D.DATUM
      \end{document}
      

      Das hatte ich aus libreoffice exportiert (Speichern unter …) und dann ein wenig „gestrippt“.

      Darin wird einfach alles, was der hash $date an keys so hergibt, mit dessen Wert ersetzt und dann wird das Ergebnis durch pdflatex "gejagt", welches ein wunderbares, durchsuchbares und speichersparendes PDF erzeugt. Nichts davon ist „Raketenwissenschaft“.

      Aber: „He! Wer will es denn einfach und mit tollen Ergebnissen, wenn es auch kompliziert und schlecht geht?“

      1. Offenbar hat sich jemand nicht genügend Gedanken darüber gemacht, dass der Weg, das PDF mit LaTeX zu erzeugen, definitiv auch der wohl beste Ansatz dazu ist, auch alle Übrigen, genannten und noch nicht genannten Probleme (Wasserzeichen, Unveränderlichkeit des Dokuments, Zusammenfügen mehrerer Dokumente) von Henry zu lösen.

        Der beispielhaft gezeigte Weg löst auch das Problem, dass HTML und PDF verschiedene Medien adressieren, dass also die Erzeugung von PDF (gedacht für Druck und Archivierung, teilweise und suboptimal für Präsentationen) aus HTML (gedacht für die Anzeige auf Bildschirmen) aus diesem Grund stets die "allerletzte" Lösung ist. Und ich nehme nicht an, dass es Henry um das Erzeugen von PDFs aus irgendwelchen Webseiten Dritter geht, sondern sehr wohl um das Erzeugen eines PDFs aus Daten. Und zwar aus Daten, die er tatsächlich hat.

        Was er als Projekt vorhat, dass hat er zwar nicht verraten, aber im Kern gibt es nicht viele Anwendungen für sein Ansinnen.

        1. Wie stets in solchen Fällen nehme ich also an, dass es, wenn keine Gründe für eine negative Bewertung angegeben werden, es auch keine nennenswerten Gründe gibt.

          Denn gäbe es solche, dann würden diese sicherlich auch für so intressant gehalten werden, als dass man diese auch mitteilen vermöchte.

          1. Hallo Raketenwissenschaftler,

            für den Beitrag mit Latex habe ich keine Bewertung abgegeben, für die Folgebeiträge auch nicht.

            Latex ist einerseits eine spannende Idee, andererseits verfehlt es das Thema. Henry möchte ein PDF aus HTML erzeugen, nicht aus Latex. Das kann viele Gründe haben, einer mag sein, dass 5 Sprachen (HTML,CSS,JS,PHP,SQL) im Portfolio schon eine Menge sind und die 6. nicht mehr unbedingt erwünscht ist. Aber das ist Hypothese, kein Wissen. Vielleicht ist er deiner Idee gegenüber aufgeschlossen, vielleicht nicht.

            Dass Du jetzt aber wegen des Minus anfängst, Selbstgespräche zu führen, das ist nicht okay. Bitte lass es einfach gut sein. Du kannst den Minusgeber (m/w/d) nicht zu einer Äußerung zwingen.

            Rolf

            --
            sumpsi - posui - clusi
            1. Hallo Rolf,

              Latex ist einerseits eine spannende Idee, andererseits verfehlt es das Thema. Henry möchte ein PDF aus HTML erzeugen, nicht aus Latex. Das kann viele Gründe haben, einer mag sein, dass 5 Sprachen (HTML,CSS,JS,PHP,SQL) im Portfolio schon eine Menge sind und die 6. nicht mehr unbedingt erwünscht ist. Aber das ist Hypothese, kein Wissen. Vielleicht ist er deiner Idee gegenüber aufgeschlossen, vielleicht nicht.

              da liegst du goldrichtig. Ja ich brauche was flexibles, was "einfaches HTML/CSS" in brauchbare PDF umwandeln kann, denn ich möchte mir nicht jedes Mal eine Schablone bauen müssen. Vor vielen Jahren gab es dieses Script, dass meine Bedürfnisse leidlich erfüllte, wenn auch nicht gerade mit guter Perfomance.

              Doch das ist leider veraltet. Es gibt zwar dennoch schon eine Scripte die das wohl aktueller und besser können, doch da scheitere ich an meiner Ablehnung gegenüber Composer und anderen Abhängigkeiten. Vielversprechend klingt allerdings noch der Vorschlag von @Christian Kruse, muss halt nur mal schauen wie das mit der Installation und Bedienung klappt. Und @Felix Riesterer, das Posting hier ist mitnichten vergleichbar mit dem anderen Thread, wenn du nach dem Motto lebst "Composer, friss oder stirb", weil das für dich wohl so simple ist, dann frage ich mich warum du nicht mein Angebot annimmst und es mir für einen fairen Betrag (dir oder dem Verein zugute) installierst und vom Composer Ballast danach befreist? Meckern ist immer leicht.

              Gruss
              Henry

              --
              Meine Meinung zu DSGVO & Co:
              „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
              1. Ja ich brauche was flexibles, was "einfaches HTML/CSS" in brauchbare PDF umwandeln kann,

                denn ich möchte mir nicht jedes Mal eine Schablone bauen müssen.

                Hm.

                • Das es Dir um "einfaches HTML/CSS" geht ist ein Umstand, von dem wir durchaus etwas früher hätten wissen müssen. Allerdings lässt Du noch immer offen, was wohl das "einfach" bedeutet. Ich kenne für die direkte Umwandlung von HTML in PDF nur Werkzeuge, die nicht etwa erst an HTML5 sondern schon an HTML5 und erst recht an - für mich - einfachem CSS grandios scheitern.

                Das Scheitern ist auch nicht weiter verwunderlich, denn HTML enthält Informationen, die für den "Satz" benötigt werden, einfach nicht. Die werden durch Annahmen ersetzt - die dann eben auch falsch sein können.

                • Was sind den brauchbare PDF?
                • Welche Frequenz beschreibt "jedes Mal"?

                Bei Lösungsangeboten in diesem Bereich ist eine mindestens grobe Kenntnis des Projekts wichtig. Es kann sich - neben den angebotenen Lösungen - auch die vom Fragenden verfolgte Idee nämlich stets als Irrweg erweisen.

                1. Dieser Beitrag wurde gelöscht: Der Beitrag ist unkonstruktiv oder provokativ und trägt zu einer Verschlechterung der Stimmung bei.
                2. Hallo Raketenwissenschaftler,

                  • Das es Dir um "einfaches HTML/CSS" geht ist ein Umstand, von dem wir durchaus etwas früher hätten wissen müssen.

                  Vielleicht solltest du mein Anfangsposting nochmal lesen:

                  …Dass ich lediglich eine URL angeben muss um daraus(aus einfachem HTML mit CSS) bevorzugt durch PHP ein PDF zu erstellen, das Resultat sollte visuell möglichst nah am Original sein…

                  Allerdings lässt Du noch immer offen, was wohl das "einfach" bedeutet.

                  Einfachstes und logisches HTML und CSS, ohne Schnick Schnack. Artikel, Rechnungen, Tabellen, usw…

                  • Was sind den brauchbare PDF?

                  Das was aus vielen CMS von Haus aus drin ist, also das was man sieht als PDF anschauen/drucken.

                  • Welche Frequenz beschreibt "jedes Mal"?

                  Nahezu täglich

                  Bei Lösungsangeboten in diesem Bereich ist eine mindestens grobe Kenntnis des Projekts wichtig. Es kann sich - neben den angebotenen Lösungen - auch die vom Fragenden verfolgte Idee nämlich stets als Irrweg erweisen.

                  Ich glaube auch das habe ich bereits hinreichend beschrieben.

                  Gruss
                  Henry

                  --
                  Meine Meinung zu DSGVO & Co:
                  „Principiis obsta. Sero medicina parata, cum mala per longas convaluere moras.“
                3. Er sucht nicht Dich und auch nicht Deine Lösung. MFG

                  1. Er sucht … nicht Deine Lösung.

                    Nunja, ich hatte zwei Vorschläge gemacht:

                    1. pageres (node.js) - Erzeugt ein Bildschirmfoto mit Hilfe eines headless aufgerufenen chromium. Vorteil: Kann an HTML, CSS, sogar Javascript, was ein Browser kann. Man kann das Format des Bildschirmfotos (durch Angabe der Größe des Ports) frei bestimmen. Nachteil: Das erzeugte PDF ist nicht durchsuchbar. Verwendung: Wenn ich keinen Einfluss auf die Seiten bzw. deren Quelltext habe und ein garantiert anständiges Ergebnis mit der Wiedergabe dessen haben will, was ein Benutzer am Bildschirm sieht, welches nicht durchsuchbar sein muss und dessen Dateigröße auch mal 50 oder 2MB (Denken wir an Hintergrundbilder auf der fremden Webseite) betragen darf, dann wäre das mein Mittel der Wahl. Es versagt aber, wenn sich z.B. diese neumodische Cookie-Abfrage in den Vordergrund drängelt. Javascript ist, so scheints, nicht abstellbar und man müsste also das Cookie herausfinden und setzen.

                    2. LaTeX. Verwendung: Wenn ich immer die gleichen - eigenen - Seite aus einer Datenbank (aus Daten) mit einer begrenzten Anzahl von Strukturen erzeugen und ein optimales Ergebnis mit allen Vorteilen eines PDF haben will, welches also auch durchsuchbar sein soll und dessen Dateigröße mininimal sein soll, dann wäre das Erzeugen eines PDF aus einer tex-Vorlage mein Mittel der Wahl.

                    Und hier schreibe ich mal komprimiert hin, warum ich diese Vorschläge gemacht habe:

                    • Habe ich - weil es fremde Webseiten sind - keinen Einfluss auf das in den Webseiten enthaltene HTML, CSS und Javascript, dann bringen alle mir bekannten Lösungsansätze, bei denen versucht wird, PDFs direkt aus HTML und CSS von fremden Webseiten erzeugen, schon aus technischen (also zwingenden!) Gründen quasi nicht vorhersagbare und in vielen Fällen sehr schlechte Ergebnisse.

                    • Das von Gunnar vorgeschlagene wkhtml benutzt ebenfalls einen headless aufgerufenen Webbrowser (libqt5webkit5 +Abhängigkeiten werden installiert). Das intern via Postscript-Treiber „gedruckte“ und „nicht wirklich“ durchsuchbare (ab dem 3. Zeichen kommt „nicht gefunden“) PDF basiert, wenn im CSS vorgesehen, auf der Druckversion der Seite (was nicht „schlecht“ ist, was man aber nicht immer so will) - und ist auch recht groß. Anders als bei pageres führt die genutzte webkitengine Javascript nur auf Anweisung aus. CSS wird oft ganz ignoriert - möglicherweise dann, wenn es keine Anweisungen für den Druck enthält. Und es verteilt auch Zeilen auf zwei Seiten:

                    wkhtml verteilt Zeilen auf zwei Seiten

                    Summa summarum:

                    Anders ausgedrückt hat jede der von mir untersuchten Lösungen Vor- und Nachteile also auch Grenzen…

  5. Moin Henry,

    wenn dein HTML XHTML ist, kannst du es per XSL-FO für fop aufbereiten und daraus eine PDF erzeugen lassen.

    Viele Grüße
    Robert