簡體   English   中英

您可以檢測從瀏覽器PDF查看器打印或下載PDF的時間嗎?

[英]Can you detect when a PDF is printed or downloaded from the browser PDF viewer?

我們有一個AngularJS Web應用程序,可以從服務器加載PDF文檔,並在頁面中顯示如下:

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

每當用戶執行某些操作時,我們都會有新的審核要求:

  1. 查看文檔(完成)
  2. 打印文檔
  3. 下載文檔

PDF下載和打印控件位於瀏覽器PDF查看器中。 我們只需支持最新的Google Chrome(截至2018年7月的Chrome 68)。

是否可以檢測從PDF查看器下載或打印文件的時間? 我沒有看到任何前印刷/后印刷事件,我認為因為它是交叉原點。 我們不需要控制處理程序,只是以某種方式檢測事件。

您是否嘗試過創建自己的pdf查看器?

有pdf查看器組件隨時可用,您可以在其中編輯pdf查看器(例如向按鈕添加事件偵聽器,定位它們等)。

我記得很久以前在角度上用pdf.js構建了一個。 我相信pdf.js你可以實現所有上述用例。

遺憾的是,您無法將任何腳本附加到PDF窗口,因為它來自MIME類型"application/pdf"

如果您在Chrome瀏覽器中加載一些PDF,然后查看開發者控制台,您將看到如下代碼:

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

我試圖在PDF窗口中添加一些腳本,如下所示:

<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>

但它沒有任何作用,因為MIME類型是"application/pdf"

您只能檢測HTML文檔的打印事件如下所示:

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()
    });
}

有關詳細信息以及可以使用的內容,請閱讀本文

可能你可以使用這個代碼,但我認為不適用於這種情況。

因此,只有在編寫自己的PDF查看器時才能編寫解決方案。 例如,您可以使用PDF.js來實現此目標。 PDF.js是用JavaScript編寫的可移植文檔格式(PDF)查看器。 它是開源的,你可以在這里下載GitHub上的完整源代碼。

下載是相同的(只有你自己的PDF查看器),但我想建議閱讀以下鏈接:

也許在我的回答中你可以節省你的時間!

你說它是從瀏覽器中檢測到的。 print()是一個window級函數。

我希望這個鏈接的前兩個答案可以幫助您進行打印收聽 如何檢測window.print()完成

關於下載完整的監聽器 ,您需要實現邏輯

如果下載部分文檔沒有增加,則下載進度條為100%。

那就意味着打印完成了。 當您下載pdf文檔時,這非常適合您,這些文檔無法下載到多個文件中。

所以,你設置了一個進度條。 您使用該進度條,直到下載的文件在每個間隔中保持遞增(此處設置超時)。 即使在等待超時間隔后,您也沒有增加下載的文件,您可以將其定義為進度條的結尾。

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

對於鏈接單擊偵聽器: 添加onclick函數以轉到JavaScript中的URL?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM