![](/img/trans.png)
[英]How can I prevent a PDF file from being downloaded or printed with PHP or JavaScript?
[英]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}">
每當用戶執行某些操作時,我們都會有新的審核要求:
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.