coder: Quittung drucken

Ich habe ein System mit HTML/PHP/JavaScript geschrieben, aus dem es auch Möglich sein soll eine Quittung zu drucken.
Der Druck soll 80mm breit sein und sich in der Höhe anpassen.
Wenn ich jetzt allerdings etwas drucke wird die Quittung immer so hoch wie eine A4 Seite, da die Kopf und Fußzeile mit gedruckt wird.

Kann ich verhindern, dass diese mit gedruckt wird? Und da dies wahrscheinlich nicht geht, kann ich es machen, dass die Fußzeile direkt nach meinem Inhalt gedruckt wird und nicht viele Zeilen später?

  1. Om nah hoo pez nyeetz, coder!

    Kann ich verhindern, dass diese mit gedruckt wird?

    Du für dich ja, über die Einstellungen "Seite einrichten" o.ä. Für die Allgemeinheit sollte es imho nicht funktionieren.

    Und da dies wahrscheinlich nicht geht, kann ich es machen, dass die Fußzeile direkt nach meinem Inhalt gedruckt wird und nicht viele Zeilen später?

    imho nein.

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Beton und betont.

  2. Hallo,

    Kann ich verhindern, dass diese mit gedruckt wird? Und da dies wahrscheinlich nicht geht, kann ich es machen, dass die Fußzeile direkt nach meinem Inhalt gedruckt wird und nicht viele Zeilen später?

    lege ein eigenes Stylesheet für media="print" an. Dann wird nur das gedruckt, was dort definiert ist. Kopf- und Fußzeile kannst du hier dann ausblenden. Besser wäre es aber vermutlich, ein Quittungs-PDF anzulegen und dieses zum Druck anzubieten.

    1. Hi,

      Kann ich verhindern, dass diese mit gedruckt wird? Und da dies wahrscheinlich nicht geht, kann ich es machen, dass die Fußzeile direkt nach meinem Inhalt gedruckt wird und nicht viele Zeilen später?
      lege ein eigenes Stylesheet für media="print" an. Dann wird nur das gedruckt, was dort definiert ist. Kopf- und Fußzeile kannst du hier dann ausblenden.

      nein, kannst du nicht, weil die nicht Teil des HTML-Dokuments sind, sondern aufgrund der Browsereinstellungen extra dazukommen. Diese Einstellungen kann nur der jeweilige lokale Nutzer für seinen Browser einstellen.

      Besser wäre es aber vermutlich, ein Quittungs-PDF anzulegen und dieses zum Druck anzubieten.

      Ja. Dann hat man deutlich mehr Freiheiten, weil die gängigen PDF-Viewer nicht zusätzlich zum Dokument irgendwelche Kopf- und Fußzeilen generieren. Jedenfalls ist mir noch keiner untergekommen, der das tut.

      Ciao,
       Martin

      --
      Elefant zum Kamel: "Sag mal, wieso hast du denn den Busen auf dem Rücken?"
      Kamel:             "Ziemlich freche Frage für einen, der den Penis im Gesicht hat."
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hi,

        Kann ich verhindern, dass diese mit gedruckt wird? Und da dies wahrscheinlich nicht geht, kann ich es machen, dass die Fußzeile direkt nach meinem Inhalt gedruckt wird und nicht viele Zeilen später?
        lege ein eigenes Stylesheet für media="print" an. Dann wird nur das gedruckt, was dort definiert ist. Kopf- und Fußzeile kannst du hier dann ausblenden.

        nein, kannst du nicht, weil die nicht Teil des HTML-Dokuments sind, sondern aufgrund der Browsereinstellungen extra dazukommen. Diese Einstellungen kann nur der jeweilige lokale Nutzer für seinen Browser einstellen.

        Besser wäre es aber vermutlich, ein Quittungs-PDF anzulegen und dieses zum Druck anzubieten.

        Ja. Dann hat man deutlich mehr Freiheiten, weil die gängigen PDF-Viewer nicht zusätzlich zum Dokument irgendwelche Kopf- und Fußzeilen generieren. Jedenfalls ist mir noch keiner untergekommen, der das tut.

        Ciao,
        Martin

        Die Idee mit der PDF hatte ich auch schon. Ich habe dabei jedoch nur ein Problem: die Quittung soll sofort gedruckt werden. Bei der PDF muss diese jedoch erst geöffnet werden und dann auf Drucken gegangen werden. Das verbraucht sehr viel Zeit, die nicht da ist.
        Gibt es eine Möglichkeit diesen Umweg zu umgehen? Also das die PDF sofort gedruckt wird?

        1. Hallo coder

          Gibt es eine Möglichkeit diesen Umweg zu umgehen? Also das die PDF sofort gedruckt wird?

          Ja, such mal nach pdfp (vielleicht gibt es auch andere vergleichbare Programme).
          Damit können PDFs direkt gedruckt werden, ohne erst einen Reader starten zu müssen.

          Ich verwende eine Batch-Datei, die das Programm mit den nötigen Parametern (Druckerauswahl) aufruft, um automatisch alle PDF-Dukumente aus einem Ordner auszudrucken.

          Auf Wiederlesen
          Detlef

          --
          - Wissen ist gut
          - Können ist besser
          - aber das Beste und Interessanteste ist der Weg dahin!
        2. Moin Moin!

          Die Idee mit der PDF hatte ich auch schon. Ich habe dabei jedoch nur ein Problem: die Quittung soll sofort gedruckt werden. Bei der PDF muss diese jedoch erst geöffnet werden und dann auf Drucken gegangen werden. Das verbraucht sehr viel Zeit, die nicht da ist.

          Das klingt für mich nach Kasse und Intranet.

          Sprich den Kassendrucker direkt vom Server aus an, z.B. über JetDirect (Raw Data via 9100/tcp), LPR, CUPS oder eine Windows-Freigabe des Druckers. Sprich direkt in seiner Sprache (JetDirect, LPR, CUPS, Windows) bzw. Postscript (CUPS) mit dem Drucker.

          Das spart das Theater mit dem PDF, und Du kannst alle Möglichkeiten des Druckers nutzen (z.B. Cutter, Barcodes, ...).

          Wenn Du Webserver, Browser und Drucker in einem System zusammengebaut hast, ist die Kommunikation überhaupt kein Problem (stumpf via localhost / 127.0.0.1 / ::1). Bei einem Server und mehreren Kassen mit direkt an die Kasse angeschlossenen Drucker kannst Du direkt die REMOTE_ADDR als Drucker-IP-Adresse benutzen. Bei solo im Netz hängenden Druckern brauchst Du in der Anwendung eine Übersetzungstabelle von REMOTE_ADDR auf Drucker-Adresse.

          Alexander

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          1. Moin Moin!

            Die Idee mit der PDF hatte ich auch schon. Ich habe dabei jedoch nur ein Problem: die Quittung soll sofort gedruckt werden. Bei der PDF muss diese jedoch erst geöffnet werden und dann auf Drucken gegangen werden. Das verbraucht sehr viel Zeit, die nicht da ist.

            Das klingt für mich nach Kasse und Intranet.

            Sprich den Kassendrucker direkt vom Server aus an, z.B. über JetDirect (Raw Data via 9100/tcp), LPR, CUPS oder eine Windows-Freigabe des Druckers. Sprich direkt in seiner Sprache (JetDirect, LPR, CUPS, Windows) bzw. Postscript (CUPS) mit dem Drucker.

            Das spart das Theater mit dem PDF, und Du kannst alle Möglichkeiten des Druckers nutzen (z.B. Cutter, Barcodes, ...).

            Wenn Du Webserver, Browser und Drucker in einem System zusammengebaut hast, ist die Kommunikation überhaupt kein Problem (stumpf via localhost / 127.0.0.1 / ::1). Bei einem Server und mehreren Kassen mit direkt an die Kasse angeschlossenen Drucker kannst Du direkt die REMOTE_ADDR als Drucker-IP-Adresse benutzen. Bei solo im Netz hängenden Druckern brauchst Du in der Anwendung eine Übersetzungstabelle von REMOTE_ADDR auf Drucker-Adresse.

            Alexander

            Das klingt sehr gut. Danke!
            Ich werde den Drucker also ganz normal im Windows einrichten. Wie kann ich dann den Druck starten? JavaScript oder PHP? Und wie sende ich die Daten an den Drucker?

            1. Om nah hoo pez nyeetz, coder!

              Bitte zitiere nur das, worauf du dich konkret beziehst. Vollzitate sind in diesem Forum weder notwendig noch erwünscht, da jeder den gesamten Thread "in einem Rutsch" lesen kann und dabei die Vollzitate nur stören.

              Danke.

              Matthias

              --
              Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Hort und Hortensie.

            2. Moin Moin!

              Das klingt sehr gut. Danke!
              Ich werde den Drucker also ganz normal im Windows einrichten. Wie kann ich dann den Druck starten? JavaScript oder PHP? Und wie sende ich die Daten an den Drucker?

              Du machst aus dem Rechner, an dem der Drucker hängt, einen (überdimensionierten) Printserver, z.B. mit CUPS, port910nd, lpd oder eben einer Windows-Drucker-Freigabe. Dann sorgst Du von der Anwendungsseite aus - im Web-Umfeld also vom Webserver aus - dafür, dass der Drucker mit Druckjobs versorgt wird. Der Browser hat damit nichts zu tun, außer dass er auf dem Webserver das Druckprogramm anstößt.

              Wie Du die Daten zum Drucker bekommst, hängt vom jeweils benutzen Protokoll ab. CUPS steuert man per HTTP oder HTTPS auf 631/tcp an, p910nd wie alle anderen JetDirect-Emulationen auch über eine 9100/tcp (erster Drucker), 9101/tcp (zweiter Drucker), 9102/tcp (dritter Drucker) an, lpd wartet auf 515/tcp, und Windows erreichst Du nur über ein anderes Windows oder Samba. Wenn der Server unter Windows läuft, bindest Du den Drucker vom Client ein und steuerst den vom Webserver aus wie jeden anderen Windows-Drucker an. Unix-Server brauche ein Tool wie smbprint (im Lieferumfang von Samba) oder CUPS (das sollte direkt auf Drucker an Windows-Rechnern drucken können). Bei einem halbwegs modernen Linux richtest Du am einfachsten CUPS ein und druckst stumpf über CUPS.

              Alexander

              --
              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
          2. Ich habe gerade noch einmal darüber nachgedacht und mir ist eingefallen, dass das System über das WWW läuft und der Computer, neben dem der Drucker steht, auch über das WWW darauf zugreift.
            Damit kann ich den Drucker ja nicht an den Server anschließen, da er beim Hoster steht.

            Und da man die Kopf- und Fußzeilen nicht abschalten kann: Gibt es eine Möglichkeit die Druckbreite der Seite festzulegen und die Höhe automatisch anzupassen?

            1. Moin Moin!

              Ich habe gerade noch einmal darüber nachgedacht und mir ist eingefallen, dass das System über das WWW läuft und der Computer, neben dem der Drucker steht, auch über das WWW darauf zugreift.
              Damit kann ich den Drucker ja nicht an den Server anschließen,

              Hab ich auch nie gesagt. Der Webserver soll einen Druckjob am Webbrowser vorbei zum Client schicken.

              da er beim Hoster steht.

              Warum stellst Du ein Kassensystem für eine Kasse bei einem Hoster auf?

              Root-Server? Dann denk mal über ein VPN nach!

              Und da man die Kopf- und Fußzeilen nicht abschalten kann: Gibt es eine Möglichkeit die Druckbreite der Seite festzulegen und die Höhe automatisch anzupassen?

              Nicht innerhalb der Grenzen, die Dir jeder Webbrowser setzt. Es gibt einige Möglichkeiten, innerhalb eines HTML-Dokuments auf mehr Funktionen des Betriebssystems zuzugreifen, als der Browser normalerweise erlaubt:

              Wenn Du Dich auf Microsofts häßlicher Insel einmauern willst, schreibst Du dem Benutzer den Internet Exploder vor und frickelst ein ActiveX-Control zusammen, das die Ansteuerung des Druckers übernimmt.

              Wenn Du Dich auf Oracles kürzlich von Sun gekaufter, genauso häßlichen, aber etwas größeren Insel einmauern willst, schreibst Du deinem Benutzer das Oracle/Sun-Java-Plugin vor und frickelst ein signiertes(!) Java-Applet zusammen, das die Ansteuerung des Druckers übernimmt.

              Die dritte häßliche Insel gehört Adobe und heißt Flash, wobei ich da nicht weiß, ob Flash Zugriff auf die Drucker-API bekommen kann.

              Die vierte häßliche Insel darfst Du selbst aufschütten, Du baust eine Spezial-Applikation, die einen Webbrowser enthält und diesen über irgendwelche mehr oder weniger wilden Wege mit einer Javascript-API für die Ansteuerung des Druckers versieht. Diese API steuerst Du per Javascript in dem ausgelieferten HTML-Dokument an.

              Allen vier Inseln gemein ist, dass sie zum einen eine "Bitte warten, ich drucke"-Seite anzeigen, zum anderen den auf dem Server vorbereiteten Druckjob via HTTP abholen oder bereits im HTML-Dokument vorfinden und zum Drucker schicken. Der Webserver selbst bereitet bei dieser Variante den Druck nur vor, anders als bei der Lösung via CUPS/p910nd/Samba kommuniziert der Webserver aber nicht mit dem Drucker.

              Alexander

              --
              Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
              1. Root-Server? Dann denk mal über ein VPN nach!

                Einen Root-Server habe ich leider nicht.
                Gibt es eine Möglichkeit einen Text aus dem WWW an einen lokalen Printserver zu senden?
                So könnte ich den Druck realisieren.

                1. CUPS kann das, wenn er entsprechend eingerichtet ist, vermutlich andere Printserver auch.
                  Entscheidend ist nur, ob das Protokoll entsprechend geroutet werden kann.

                2. Moin Moin!

                  Root-Server? Dann denk mal über ein VPN nach!

                  Einen Root-Server habe ich leider nicht.

                  Dann überdenk Dein Konzept mal gründlich. Warum steht der Server im Internet und nicht im lokalen Netz?

                  Gibt es eine Möglichkeit einen Text aus dem WWW an einen lokalen Printserver zu senden?
                  So könnte ich den Druck realisieren.

                  Natürlich, außer Samba können alle von mir genannten Protokolle (CUPS=IPP=HTTP, LPD, Port9100) beliebig durch's Internet geroutet werden. Der Haken ist, dass bei einem einfachen Port Forwarding durch den üblichen DSL-Router jeder auf den Drucker zugreifen kann. Rechne also damit, dass Quittungen nur den kleinsten Teil des Druckvolumens ausmachen werden. Minimal sollte also der Zugriff auf die IP-Adresse des Webservers beschränkt werden.

                  CUPS sollte Authentifizierung können, weil IPP auf HTTP/1.1 basiert. LPD kann Authentifizierung nur als Erweiterung und dann nur mit Kerberos, Port9100 läßt stumpf jeden drucken.

                  Alexander

                  --
                  Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
                  1. Dann überdenk Dein Konzept mal gründlich. Warum steht der Server im Internet und nicht im lokalen Netz?

                    Weil auch andere Nutzer (aus dem Internet) über einen Login auf das System zugreifen müssen. Dabei wird jedoch kein Druck ausgeführt.

      2. Hik

        nein, kannst du nicht, weil die nicht Teil des HTML-Dokuments sind, sondern aufgrund der Browsereinstellungen extra dazukommen. Diese Einstellungen kann nur der jeweilige lokale Nutzer für seinen Browser einstellen.

        ach so, hatte ich falsch gelesen. Ich dachte, er meint Kopf- und Fußzeile seines HTML-Dokuments. sorry