Klawischnigg: Per DOM auf pdf-Plugin zugreifen

Hi there,

kennt jemand von Euch eine Möglichkeit, per DOM auf das pdf-Plugin im Browser zuzugreifen (wenn installiert)?
Konkret geht es darum festzustellen, ob ein angezeigtes PDF-Dokument (zB eine Rechnung, die generiert wurde), gedruckt wurde...

  1. Moin Moin!

    kennt jemand von Euch eine Möglichkeit, per DOM auf das pdf-Plugin im Browser zuzugreifen (wenn installiert)?

    Hmm, welches der diversen Plugins denn? Und über welche Schnittstelle?

    Konkret geht es darum festzustellen, ob ein angezeigtes PDF-Dokument (zB eine Rechnung, die generiert wurde), gedruckt wurde...

    Da hätte ich einen sehr kreativen Ansatz, ich weiß allerdings nicht, mit welchen Plugins (außer dem von Adobe) der funktioniert. Ich habe irgendwann mal einen Gutschein für eine Gratis-Paketmarke bekommen, die Paketmarke selbst mußte ich im WWW vorbereiten (Absender, Empfänger, ...) und bekam dann ein PDF, das sich exakt einmal mit Wert ausdrucken lies.

    Man konnte im PDF selbst einen Probedruck auslösen, bei dem die Barcodes so überdeckt wurden, dass sie unlesbar waren. Den Probedruck konnte man beliebig oft machen, den Druck ohne die ungültig machende Überdeckung nur einmal. Dazu hat sich das PDF bei jedem Druck mit einem Server im WWW verbunden und überprüft, ob die Marke schon verbraucht wurde. Ohne Netz-Anbindung funktionierte nur der Probedruck.

    Frag mich aber nicht, wie das genau implementiert wurde. Ich denke, man hat die Formular- und Javascript-Fähigkeiten des Adobe-Viewers genutzt und über irgendeine RPC-Schnittstelle (SOAP, XMLRPC, whatever) den Kontrollserver abgefragt.

    Alternativer Ansatz für LANs: Drucke ohne den Umweg über das PDF und den Client-Rechner direkt vom Server auf einen ausgewählten Drucker. CUPS kann da sehr hilfreich sein, für Windows-Kisten mit per USB angestöpselten Druckern gibt es Helferlein wie RawPrintServer, die aus der Windows-Kiste einen überteuerten JetDirect-Printserver machen (Druckjob per TCP auf Port 9100).

    Alexander

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

      kennt jemand von Euch eine Möglichkeit, per DOM auf das pdf-Plugin im Browser zuzugreifen (wenn installiert)?

      Hmm, welches der diversen Plugins denn? Und über welche Schnittstelle?

      Gute Frage. Ich dachte an das Plugin von Adobe, das bei Gecko-Browsern PDF-Dateien anzeigt. Über die Schnittstelle hab ich mir noch keine Gedanken gemacht. Es gibt js-Libraries, die befassen sich aber nur mit dem Einbinden von pdf-Dateien, die bekommen von der Schnittstelle nichts zurück. Hätte ja sein können, daß irgendein Event getriggert wird, wenn auf den Print-Button geklickt wird, das scheint aber nicht der Fall zu sein oder ich habs (noch) nicht gefunden.

      Da hätte ich einen sehr kreativen Ansatz, ich weiß allerdings nicht, mit welchen Plugins (außer dem von Adobe) der funktioniert. [... ]Frag mich aber nicht, wie das genau implementiert wurde. Ich denke, man hat die Formular- und Javascript-Fähigkeiten des Adobe-Viewers genutzt und über irgendeine RPC-Schnittstelle (SOAP, XMLRPC, whatever) den Kontrollserver abgefragt.

      Klingt interessant, wäre da aber übers Ziel hinausgeschossen. Ich brauch das nur um zu entscheiden, ob eine Rechnung nun gedruckt oder wiederholt wird. Das kann unter Umständen einen Unterschied ausmachen. Rechtlich ist es aber eh wurscht, weil mich niemand daran hindern kann, eine Rechnung beliebig zu kopieren (und wenns gar nicht anders geht, zu fotokopieren).

      Die meisten Anwender drucken die Rechnung ohnehin nicht mehr, die mailen das gleich, und das registrier ich natürlich, weil es über meine Anwendung passiert.

      Alternativer Ansatz für LANs: Drucke ohne den Umweg über das PDF und den Client-Rechner direkt vom Server auf einen ausgewählten Drucker. CUPS kann da sehr hilfreich sein, für Windows-Kisten mit per USB angestöpselten Druckern gibt es Helferlein wie RawPrintServer, die aus der Windows-Kiste einen überteuerten JetDirect-Printserver machen (Druckjob per TCP auf Port 9100).

      Danke für diesen Tip, ich wusste nicht, daß so etwas überhaupt möglich ist, ich werde mir das sicher genauer anschauen, weil es dafür viele Anwendungsmöglichkeiten gibt...

      1. Moin Moin!

        Hi there,

        kennt jemand von Euch eine Möglichkeit, per DOM auf das pdf-Plugin im Browser zuzugreifen (wenn installiert)?

        Hmm, welches der diversen Plugins denn? Und über welche Schnittstelle?

        Gute Frage. Ich dachte an das Plugin von Adobe, das bei Gecko-Browsern PDF-Dateien anzeigt. Über die Schnittstelle hab ich mir noch keine Gedanken gemacht.

        So meinte ich das auch nicht. Ich meinte, welche Schnittstellen die diversen Plugins anbieteten, und wie man sie nutzen kann. Ich vermute, dass das ziemlich unterschiedlich ist.

        Es gibt js-Libraries, die befassen sich aber nur mit dem Einbinden von pdf-Dateien, die bekommen von der Schnittstelle nichts zurück. Hätte ja sein können, daß irgendein Event getriggert wird, wenn auf den Print-Button geklickt wird, das scheint aber nicht der Fall zu sein oder ich habs (noch) nicht gefunden.

        Ich vermute, dass wenigstens das Adobe-Plugin zum Browser hin stumm wie ein Fisch ist. Aber vielleicht findest Du ja eine API-Doku.

        Da hätte ich einen sehr kreativen Ansatz, ich weiß allerdings nicht, mit welchen Plugins (außer dem von Adobe) der funktioniert. [... ]Frag mich aber nicht, wie das genau implementiert wurde. Ich denke, man hat die Formular- und Javascript-Fähigkeiten des Adobe-Viewers genutzt und über irgendeine RPC-Schnittstelle (SOAP, XMLRPC, whatever) den Kontrollserver abgefragt.

        Klingt interessant, wäre da aber übers Ziel hinausgeschossen. Ich brauch das nur um zu entscheiden, ob eine Rechnung nun gedruckt oder wiederholt wird. Das kann unter Umständen einen Unterschied ausmachen.

        Naja, du mußt ja gar nicht diesen ganzen Overkill betreiben. Aber Du könntest (mit etwas Aufwand auf PDF-Seite) herausfinden, ob eine Rechnung gedruckt wurde oder nicht, in dem Du in der PDF-Datei eine Rechnungs-ID (Rechnungsnummer) ablegst, beim (genauer vor dem) Ausdrucken einen Server informierst. Und wenn der Zweitdruck irgendwie markiert werden soll, läßt sich das über den gleichen Mechanismus erledigen.

        Die meisten Anwender drucken die Rechnung ohnehin nicht mehr, die mailen das gleich, und das registrier ich natürlich, weil es über meine Anwendung passiert.

        LAN oder Internet?

        Alternativer Ansatz für LANs: Drucke ohne den Umweg über das PDF und den Client-Rechner direkt vom Server auf einen ausgewählten Drucker. CUPS kann da sehr hilfreich sein, für Windows-Kisten mit per USB angestöpselten Druckern gibt es Helferlein wie RawPrintServer, die aus der Windows-Kiste einen überteuerten JetDirect-Printserver machen (Druckjob per TCP auf Port 9100).

        Danke für diesen Tip, ich wusste nicht, daß so etwas überhaupt möglich ist,

        Was? Drucken vom Server? Oder Windows als JetDirect-Server?

        Beides geht theoretisch auch über das Internet, aber ich denke nicht, dass Leute es lustig finden, jeden Morgen den gesamten Papiervorrat aus dem Ausgabefach zu holen, weil irgendwelche Kiddies den Drucker per JetDirect mit sinnfreien Druckjobs füllen.

        Alexander

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

          Ich vermute, dass wenigstens das Adobe-Plugin zum Browser hin stumm wie ein Fisch ist. Aber vielleicht findest Du ja eine API-Doku.

          Ja, genau so etwas hätte ich gesucht;)

          Naja, du mußt ja gar nicht diesen ganzen Overkill betreiben. Aber Du könntest (mit etwas Aufwand auf PDF-Seite) herausfinden, ob eine Rechnung gedruckt wurde oder nicht, in dem Du in der PDF-Datei eine Rechnungs-ID (Rechnungsnummer) ablegst, beim (genauer vor dem) Ausdrucken einen Server informierst. Und wenn der Zweitdruck irgendwie markiert werden soll, läßt sich das über den gleichen Mechanismus erledigen.

          'tschuldige, aber jetzt steh' ich auf der Leitung;) Zur Erklärung: das ganze läuft über einen Apachen (Datenbank, PDF-Generierung etc, Authentifizierung etc.), clientseitig rennt eine js-Anwendung im Browser. Ich weiss also, wann ein PDF-generiert wurde, auch wann und ob es per email (über einen externen smtp-server) verschickt wurde. Aber zwischen Generieren und Drucken kann der Server und auch der Client leider nicht unterscheiden.

          Danke für diesen Tip, ich wusste nicht, daß so etwas überhaupt möglich ist,

          Was? Drucken vom Server? Oder Windows als JetDirect-Server?

          Geht eh nicht, Dein letzter Satz zeigt mir, daß ich Dich wieder falsch verstanden habe...;)

          1. Moin Moin!

            Naja, du mußt ja gar nicht diesen ganzen Overkill betreiben. Aber Du könntest (mit etwas Aufwand auf PDF-Seite) herausfinden, ob eine Rechnung gedruckt wurde oder nicht, in dem Du in der PDF-Datei eine Rechnungs-ID (Rechnungsnummer) ablegst, beim (genauer vor dem) Ausdrucken einen Server informierst. Und wenn der Zweitdruck irgendwie markiert werden soll, läßt sich das über den gleichen Mechanismus erledigen.

            'tschuldige, aber jetzt steh' ich auf der Leitung;) Zur Erklärung: das ganze läuft über einen Apachen (Datenbank, PDF-Generierung etc, Authentifizierung etc.), clientseitig rennt eine js-Anwendung im Browser. Ich weiss also, wann ein PDF-generiert wurde, auch wann und ob es per email (über einen externen smtp-server) verschickt wurde. Aber zwischen Generieren und Drucken kann der Server und auch der Client leider nicht unterscheiden.

            Ist ja auch nicht notwendig, denn darum kümmert sich das PDF:

            Du generierst ein spezielles PDF, dass sich nach Druck auf einen PDF-Formular-Button über PDF-Javascript-Mechanismen selbst ausdruckt. Innerhalb des PDF-Javascripts läuft eine HTTP-Abfrage zum Rechnung-Ist-Gedruckt-Server (für alle Rechnungsempfänger erreichbar), der ...
            1. notiert, dass die Rechnung (mal wieder) gedruckt wird
            2. dem Javascript mitteilt, wie oft die Rechnung bislang schon gedruckt wurde.
            Innerhalb des Javascripts kannst Du ggf. noch einen Layer über das Dokument legen, z.B. zum schwärzen von Barcodes oder für ein "Zweitdruck"-Pseudo-Wasserzeichen.

            In HTML/JS-Pseudocode:

              
            <script>  
            function druckmich(button)  
            {  
              var nr=button.form.elements['rechnungsnummer'].value;  
              var ret=http_get("http://dein.apache/rechnung/count.cgi?nr="+nr);  
              if (ret==null) {  
                alert("Oops, Server tot?");  
              } else if (ret=="0") {  
                self.print();  
              } else {  
                document.getElementsByTagName("body")[0].class="zweitdruck";  
                self.print();  
              }  
            }  
            </script>  
            <form>  
              <input type="hidden" name="rechnungsnummer" value="47110815">  
              <input type="button" onclick="druckmich(this)" value="Drucken">  
            </form>  
            
            

            So ungefähr funktionierte das jedenfalls mit der Gratis-Paketmarke. Wie man überhaupt JS in ein PDF bekommt, weiß ich nicht, mit irgendwelchen Adobe-Tools muß das auf jeden Fall gehen. Wie weit freie Tools das können, weiß Google vermutlich. Ich meine mich zu erinnern, dass die normale Druckfunktion lahmgelegt war, das geht über ein Flag beim Generieren des PDFs.

            Alexander

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

              [...] Wie man überhaupt JS in ein PDF bekommt, weiß ich nicht, mit irgendwelchen Adobe-Tools muß das auf jeden Fall gehen.

              Ich habe Deinen Vorschlag verstanden. So ähnlich hab ich mir das ja auch gedacht, aber ich verwende zum Erzeugen des PDF die FPDF-Library, ich bezweifle, daß ich da irgendwelche Javascripts 'reinkrieg (;), aber vielleicht gibts davon ja eine neue Version.

              Wie weit freie Tools das können, weiß Google vermutlich. Ich meine mich zu erinnern, dass die normale Druckfunktion lahmgelegt war, das geht über ein Flag beim Generieren des PDFs.

              Dem geh ich nach, Danke für Dein Bemühen...

            2. Hi there,

              Wie weit freie Tools das können, weiß Google vermutlich.

              Google weiss alles! ;)
              Ein erster Überblick hat mir gezeigt, daß FPDF mittlerweile über ein Addon mit Javascript umgehen kann, soll heissen, ein JS eingebunden werden kann, daß nach dem Aufruf des PDFs gestartet wird...

              1. Moin Moin!

                Wie weit freie Tools das können, weiß Google vermutlich.

                Google weiss alles! ;)
                Ein erster Überblick hat mir gezeigt, daß FPDF mittlerweile über ein Addon mit Javascript umgehen kann, soll heissen, ein JS eingebunden werden kann, daß nach dem Aufruf des PDFs gestartet wird...

                Coooool ...

                Alexander

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

        Gute Frage. Ich dachte an das Plugin von Adobe, das bei Gecko-Browsern PDF-Dateien anzeigt.

        In meinem Gecko-Browser gibt's kein Adobe-Plugin - trotzdem werden PDFs im Browser-Fenster angezeigt (Foxit macht's möglich).
        Und es gibt Leute, die haben gar kein Plugin für PDFs, die lassen PDFs außerhalb des Browsers anzeigen.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.