it-swarm.com.de

Können Sie erkennen, wann ein PDF wird gedruckt oder vom Browser heruntergeladen PDF Zuschauer?

Wir haben eine AngularJS-Web-App, die PDF Dokumente vom Server lädt und diese auf der Seite wie folgt anzeigt:

<object id="preview" type="application/pdf" data="blob:{fileUrl}">

Wir haben eine neue Anforderung zu prüfen, wann immer ein Benutzer bestimmte Aktionen ausführt:

  1. zeigt ein Dokument an (erledigt)
  2. druckt ein Dokument
  3. lädt ein Dokument herunter

Die Download- und Drucksteuerelemente für PDF befinden sich im Browser-Viewer PDF. Wir müssen nur das neueste Google Chrome unterstützen (Chrome 68 ab Juli 2018).

Ist es möglich zu erkennen, wann die Datei vom Viewer PDF heruntergeladen oder gedruckt wurde? Ich nehme an, dass ich keine Ereignisse vor und nach dem Druck sehe, da es sich um herkunftsübergreifende Ereignisse handelt. Wir müssen die Handler nicht kontrollieren, sondern nur die Ereignisse irgendwie erkennen.

9
jbkly

Haben Sie versucht, einen eigenen PDF-Viewer zu erstellen?

Es stehen PDF-Viewer-Komponenten zur Verfügung, in denen Sie Ihren PDF-Viewer bearbeiten können (z. B. Ereignis-Listener zu Schaltflächen hinzufügen, positionieren usw.). 

Ich erinnere mich, dass ich vor langer Zeit einen auf pdf.js in eckig gebaut habe. Ich bin mir sicher, dass Sie mit pdf.js alle oben genannten Anwendungsfälle implementieren können. 

6
TheViralGriffin

Leider können Sie kein Skript an das Fenster PDF anhängen, da es vom MIME-Typ "application/pdf" ist.

Wenn Sie PDF in Ihren Chrome-Browser laden und dann in die Entwicklerkonsole schauen, sehen Sie folgenden Code:

<embed width="100%" height="100%" name="plugin" id="plugin"
    src="your-pdf-path.pdf" type="application/pdf" internalinstanceid="7">

Ich habe versucht, ein Skript in das Fenster PDF wie folgt einzufügen:

<style type="text/css">html,body{height:100%;margin:0}</style>
<iframe id="iframe1" src="your-pdf-path.pdf" frameborder="0"
    style="display:block;width:100%;height:100%"></iframe>

<script type="text/javascript">
var ifrDoc = document.getElementById('iframe1').contentWindow.document;
var script = ifrDoc.createElement('script');
script.type = 'text/javascript';
script.innerText = 'alert(1)';
//OR: script.src = 'your-js-file-path.js'

ifrDoc.getElementsByTagName('head')[0].appendChild(script);
</script>

Es macht jedoch nichts, da der MIME-Typ "application/pdf" ist.

Sie können die Druckereignisse nur für HTML-Dokumente wie folgt ermitteln:

function beforePrint(){alert('before print')}

function afterPrint(){alert('after print')}

if(window.onafterprint !== void 0)
{
    window.onbeforeprint = beforePrint;
    window.onafterprint = afterPrint;
}
else if(window.matchMedia)
{
    var mediaQueryList = window.matchMedia('print');
    mediaQueryList.addListener(function(mql)
    {
        if(mql.matches)
            beforePrint();
        else afterPrint()
    });
}

Für weitere Details und für was es verwendet werden kann, lesen Sie diesen Artikel .

Möglicherweise können Sie diesen Code verwenden, aber ich denke nicht für diesen Fall.

Aus diesem Grund können Sie nur dann eine Lösung schreiben, wenn Sie Ihren eigenen PDF Viewer schreiben. Sie können beispielsweise PDF.js für dieses Ziel verwenden. PDF.js ist der in JavaScript geschriebene Viewer für das Portable Document Format (PDF). Es ist Open Source und Sie können den vollständigen Quellcode unter GitHub hier herunterladen.

Und zum Download ist das Gleiche (nur mit Ihrem eigenen PDF Viewer), aber ich würde empfehlen, die folgenden Links zu lesen:

Und mit meiner Antwort könnten Sie Ihre Zeit sparen!

2
Bharata

Sie sagten, es sei vom Browser zu erkennen. print() ist eine window-Funktion. 

Ich hoffe, die ersten beiden Antworten aus diesem Link helfen Ihnen bei Ihrem Druckhören . wie erkennt man window.print () finish

In Bezug auf Sie download complete listenener müssen Sie Logik implementieren 

wenn sich der Download-Fortschrittsbalken auf 100% befindet, wenn der heruntergeladene Teil des Dokuments nicht steigt.

dann ist der Druck abgeschlossen. Dies funktioniert perfekt für Sie, da Sie PDF-Dokumente herunterladen, die nicht in mehreren Dateien heruntergeladen werden. 

Sie haben also eine Fortschrittsleiste eingerichtet. Sie verwenden diesen Fortschrittsbalken, bis die heruntergeladene Datei in jedem Intervall inkrementiert wird (Sie legen hier ein Timeout fest). Selbst nachdem Sie auf ein Timeout-Intervall gewartet haben, wird Ihre heruntergeladene Datei nicht inkrementiert. Sie definieren dies als Ende für die Fortschrittsleiste. 

elementType.onclick = function() { 
        // if progress bar completes when file download stops
        // call downloadcompleted() function           
   }

Für den Link klicken Sie auf Listener: Hinzufügen einer Onclick-Funktion, um zur URL in JavaScript zu gelangen?

1
Uddhav Gautam