阻止 PDF 文件下载和打印

Posted

技术标签:

【中文标题】阻止 PDF 文件下载和打印【英文标题】:Prevent PDF file from downloading and printing 【发布时间】:2011-02-08 08:24:10 【问题描述】:

我正在尝试找到一种方法来防止在从 Web 上查看 PDF 时打印或下载。另外,最好是用户不能打印屏幕。

我正在考虑将这些 PDF 文件转换为 Flash。还有其他想法吗?

【问题讨论】:

pdf转flash是最好的解决方案。 您确实知道,您向用户展示的任何内容都可以以某种方式打印出来......如果您提供它,他们可以找到某种使用方式。 您无法阻止用户打印屏幕。如果您有想要显示的信息并且不希望它被物理打印,那么 PDF 并不是您选择的格式。它的全部目的是被精心印刷。 是的...可悲的是,确保您网站上的某些内容无法以某种方式打印/保存/滑动的唯一方法是不要将其放在网站上...没有这样的事情作为一个完全安全的系统等等。 在我的业务中,不需要下载 PDF 是因为不希望客户能够轻松地与其他人共享下载的材料。我制作工作表,如果它们易于共享,客户更有可能将它们通过电子邮件发送给朋友。如果共享它们变得更加复杂,他们就不太可能想去麻烦。在没有高级计算机知识的情况下无法下载它们对我来说已经足够了。希望这能阐明行业的需求。在我的情况下,能够获得屏幕截图等事情并不担心。希望这可以帮助。我 【参考方案1】:

好的,我收回我之前评论的内容。刚刚和我店里的一位资深人士谈过,他说可以把它锁起来。您可以做的是将 pdf 转换为图像/flash/whatever 并将其包装在 iFrame 中。然后,您创建另一个具有 100% 透明度的图像并将其放在 iFrame 顶部(不在其中),并将其设置为比 iFrame 具有更高的 Z 值。

这样做的目的是,如果他们右键单击“图像”来保存它,他们将改为保存透明图像。而且由于图像“覆盖”了 iFrame,任何使用打印屏幕的尝试应该被图像屏蔽,并且它们应该只能对实际不存在的图像进行快照。

只剩下一两种获取文件的方法...这需要直接挖掘源代码才能在 iFrame 中找到图像文件。仍然不是完全安全,但受到普通用户的保护。

【讨论】:

浏览器的开发者工具可以轻松地获取发送给用户的任何内容,而且您不会停止屏幕捕获程序。哎呀,用户可以用他们的手机给电脑屏幕拍照…… 右键,查看页面源码,获取透明图片下的图片链接。完成。 使用 Firebug,您只需检查透明图像,将其删除然后打印页面或根据需要保存图像,我认为认为您可以阻止它是幼稚的。确保更多信息的唯一选择是确保图像带有水印(如@MarkRedman 所述),以便您知道 打印了这个和何时 查看页面信息 > 媒体 > 另存为。只要我记得,它就在 Firefox 中。 (我想我记得它在被精简为 Firebird 之前就存在于 Mozilla Suite 中,后来成为 Firefox。)...而且,是的,如果您点击 Ctrl+I 或点击 Alt 来访问它,无需上下文菜单即可访问在 MacOS 之外显示 MacOS 菜单栏,然后​​查看工具菜单。 (或单击地址栏左端的站点信息块,然后单击“>”按钮并选择“更多信息”) @ssokolow 是的,我知道这种解决方法。我认为这是“需要挖掘源头的方法之一”。您的普通用户不知道您刚刚引用的技巧。我说你可以“硬”锁定它,但不能“让它安全”。因为不可能保护网站上的图像。但是...在其上叠加透明图像是您可以管理的最佳效果...并且可以保护它免受知道另存为和打印屏幕的典型互联网用户的影响。【参考方案2】:

最终你需要:

为每个页面创建图片 通过您自己的界面(html、flash等)在网络上向用户展示这些内容

请记住,如果需要,Flash 将无法在 Apple 设备上运行。

打印屏幕将允许他人重新创建您呈现的低分辨率图像,在这种情况下,您可以为图像添加水印。

【讨论】:

对于 2017 年阅读本文的任何人,请注意浏览器具有类似 Firefox 的“查看页面信息 > 媒体”选项卡之类的功能,该选项卡允许下载通过 html 呈现的图像,并且正在努力开始逐步淘汰插件因为它们是新安全漏洞的一大来源。 (我相信 Chrome 目前已经取消了对除 Flash 之外的所有插件的支持,并应用了允许网站运行 Flash 的白名单......主要是视频流网站。) 我可以下载这个文件 - 它提供下载和打印选项,如普通 pdf【参考方案3】:

这是不可能的。正在下载阅读。当用户正在读取文件时,浏览器正在将该文件下载到临时文件中。因此,即使您禁用下载按钮,用户也可以单击“文件 -> 另存为”或从临时文件夹中复制该文件。

您可以做一些事情:

方法一

以下代码将嵌入没有任何工具栏的 PDF 并隐藏打印/下载图标

<embed src="URL_TO_PDF.PDF#toolbar=0&navpanes=0&scrollbar=0"  >

方法02

使用Google Drive

右击pdf并转到分享(下图)

然后转到左下角的高级选项

勾选两个复选框。复制embed 链接并将其粘贴到您的src 后。 不允许下载和保存驱动器选项

【讨论】:

【参考方案4】:

如果您对 PDF 进行加密,您可以控制它的可打印性和可更改性。

打印设置:

    无 低分辨率 (150 dpi) 高分辨率(最大 dpi)

您还可以阻止人们从您的 PDF 中复制/粘贴,甚至在允许屏幕阅读器访问的同时做到这一点(视障人士仍然可以阅读您的 PDF)。

您尚未提及您用于构建 PDF 的内容,因此细节由您决定。

替代方案:您可以创建仅在打印时可见的注释。在整个页面上创建一个仅在打印时显示的实心框 -> 无有用打印。

您也许也可以对图层(可选内容组)做同样的事情,但不确定。

【讨论】:

这些权限会被基于浏览器的 PDF 查看器忽略。没用。【参考方案5】:

使用 QuickTime 的屏幕截图或任何类似方式创建视频会破坏保护您的文档文件不被复制的所有努力。

【讨论】:

【参考方案6】:

如果您想提供一个解决方案,那么,没有一个。您必须能够阻止用户运行可以访问 GPU 中的缓冲区的程序,以防止他们抓取屏幕截图。可以捕获屏幕上显示的任何内容。

如果您决定发送内容无法在线访问的文件,那么您需要依赖最终产品/应用程序使用的安全性。对于一个非常坚定的pserson来说,这也是完全可以打破的。

最后一个选项是邮寄打印的文件。使用良好快递服务的老式方式。成本上升,时间延误是不可避免的——但你得到的正是你想要的。解决方案并非没有成本。

总是乐于指出显而易见的事情:)

【讨论】:

【参考方案7】:

(免责声明 - 我为 Atalasoft 工作)

如果您使用 Atalasoft 网络图像查看器展示您的 PDF 文档,您可以阻止 PDF 被下载。您还可以在客户端控制从 javascript 打印。

【讨论】:

【参考方案8】:

我希望我有一个答案,但我只有一个的一部分。我不能把它归功于它,但获得它的方法如下。 这是一个比从回复的声音中得到的信用更严重的问题。每个人都自动假设需要保护的内容是供公众消费的。这并非总是如此。有时有法律或合同原因要求网站所有者采取一切可能的措施来防止下载文件。我能想到的最明显的一个已经提出来了。浏览器显示的“操作选项栏”几乎可以左键单击任何文件。 Adobe DRM 对此无能为力,更糟糕的是,Adobe Acrobat 甚至无法拥有自己的“保存”功能,作为“DRM”保护的一部分被阻止。无论您选择了何种其他安全选项,即使在 Reader 中也会出现此选项。

在我们的案例中,购买 Adob​​e Acrobat 只是为了为其自己的格式提供某种程度的保护。很难相信 Adob​​e 会让您阻止打印、阻止编辑、甚至阻止在没有密码的情况下打开,或者您真的可以全力以赴并使用证书进行加密。然而,他们无法在任何时候、任何地方阻止储蓄。而是提供安慰,告诉您“别担心:他们未经您许可下载的副本也将具有相同的 DRM”。不幸的是,这不是购买的唯一目的,一半的解决方案根本不是“解决方案”。 实际销售的可能有 100 个程序只是为了从 Adob​​e 文档中删除 DRM,即使没有,关键是客户指定即使有权访问私人站点的用户也不允许下载。因此,阻止下载开始的必要性并不难理解。虽然转换为 FLASH 可能会为您提供下载保护,但您将失去所有其他功能。除非我能找到一种方法来防止打开、保存 Flash 文件等。接下来,是否可以通过密码保护 Flash 文件在点击时不被打开?

我终于能够根据需要开始工作的“部分修复”仍然只禁用所有“右键单击”功能,但它确实包含一个不错的“警告框”,我可以在其中解释用户已经同意不下载,打印,保存等只是为了访问页面。我不确定我是否可以在此处发布代码,或者是否可以粘贴链接,但谷歌搜索“Maximus 右键单击​​”会带你到它。这是几个例子之一,它恰好是我可以实现的最简单的例子,并且比其他例子工作得更好。信用到期。

有人给我的另一个选择是一款名为“翻书”的产品。上面的用户对“Atalasoft”的建议(我已经找到了,并且已经发送了更多信息的请求)。希望这将是“解决方案”,我可以及时实施以提供帮助。在我看来,这是一个明显需要一步打包解决方案的地方,通常“自然法则”会在短时间内解决这种不平衡。然而,我的研究让我经历了多年的海报都要求同样的事情。看起来有人可以通过一种“简单”的方式为显然需要它的人添加更多“保护”到“PDF”(或其他文档、图像等)中,从而过上美好的生活。如果我找到它并且它有效,我会购买它。 :>)

我希望我有程序员的技能,因为我有一些很好的想法来实现这样的产品,不幸的是,我不知道如何将这些想法付诸实践。

【讨论】:

对于那些在谷歌之外徘徊的志同道合的人来说,没有这样的解决方案存在的原因是,如果你有实施它的知识,你也有能力看到不太明显的原因'永远不会工作。 (这一切都可以追溯到根本问题,在理论上,加密是关于防止 C 拦截从 A 到 B 的通信,如果 B 和 C 是同一个人并且众所周知,它会演变为“默默无闻的安全” “默默无闻的安全”只是给自己一种虚假的安全感。)【参考方案9】:

虽然我们应该同意最终您无法阻止某种形式的文档捕获(特别是通过手机或计算机的屏幕捕获技术),但目标是阻止直接下载原始文档。有人建议您将其转换为图像,但这不是必需的。显然有一种方法,因为多个云服务允许您共享 pdf 文件,删除下载选项,无需将 PDF 转换为图像(这是一种更好的方法,因为它保留了单词搜索等重要属性)。就个人而言,作为 Outlook 电子邮件的用户,我使用它提供的云服务 OneDrive。我只想分享 OneDrive 制作的 HTML 代码来分享 PDF 文件,无需下载和右键支持。我不是 HTMl 方面的专家,因此无法确切告诉您它是如何完成的,但它仍然可以为您提供一些见解。这是我共享的一个特定 PDF 的代码(没有私人信息和其他对我来说似乎不必要的部分):

<!DOCTYPE html>
<html lang="en-us" dir="ltr">
<head><meta name="GENERATOR" content="Microsoft SharePoint" /><meta http-equiv="Content-type" content="text/html; charset=utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta http-equiv="Expires" content="0" /><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" /><title>
    OneDrive for Business
</title><link rel="shortcut icon" href="/_layouts/15/images/odbfavicon.ico?rev=47" type="image/vnd.microsoft.icon" id="favicon" /></head>

  <body style="margin: 0; padding: 0;">
    <script  nonce= '55c3d852-fe79-49b0-927d-e793a0ba3192' >if(!spfxPerfMarks)var spfxPerfMarks = ; var markPerfStage=function(key) if(window.performance && typeof window.performance.now === 'function')spfxPerfMarks[key]=window.performance.now(); elsespfxPerfMarks[key]=Date.now(); if (window.performance && typeof window.performance.mark === 'function') window.performance.mark(key);;</script><script type="text/javascript" id="SuiteNavShellCore" nonce="55c3d852-fe79-49b0-927d-e793a0ba3192" crossorigin="anonymous" src="https://shellprod.msocdn.com/api/shellbootstrapper/business/oneshell">

</script><script type="text/javascript" nonce="55c3d852-fe79-49b0-927d-e793a0ba3192">
    window.document.getElementById('SuiteNavShellCore').addEventListener('error', function()  
var scriptElem = document.getElementById('SuiteNavShellCore');
scriptElem.parentNode.removeChild(scriptElem);
var newScript = document.createElement('script');
newScript.setAttribute('type', 'text/javascript');
newScript.setAttribute('id', 'SuiteNavShellCore');
newScript.setAttribute('src', 'https://shellprod.msocdn.com/api/shellbootstrapper/business/oneshell');
newScript.setAttribute('crossorigin', 'anonymous');
newScript.async = true;
newScript.addEventListener('load', function()  (typeof markPerfStage === 'function' && markPerfStage('suiteNavScriptAsyncEnd')); if (window.executeSuiteNavOnce)  window.executeSuiteNavOnce()  );
newScript.addEventListener('error', function()  window.o365ShellScriptLoadError = arguments[0]; (typeof markPerfStage === 'function' && markPerfStage('suiteNavScriptError')); if (window.executeSuiteNavOnce)  window.executeSuiteNavOnce()  );
document.head.appendChild(newScript); );
</script><script type="text/javascript" nonce="55c3d852-fe79-49b0-927d-e793a0ba3192">
    window.o365ShellLoadPromiseResolve = undefined; window.o365ShellLoadPromiseReject = undefined; window.o365ShellRenderPromiseResolve = undefined; window.o365ShellRenderPromiseReject = undefined; window.o365ShellPostRenderPromiseResolve = undefined; window.o365ShellPostRenderPromiseReject = undefined; window.o365ShellLoadPromise = new Promise(function (loadResolve, loadReject)  window.o365ShellLoadPromiseResolve = loadResolve, window.o365ShellLoadPromiseReject = loadReject ); window.o365ShellRenderPromise = new Promise(function (renderResolve, renderReject)  window.o365ShellRenderPromiseResolve = renderResolve, window.o365ShellRenderPromiseReject = renderReject ); window.o365ShellPostRenderPromise = new Promise(function (prResolve,prReject)  window.o365ShellPostRenderPromiseResolve = prResolve, window.o365ShellPostRenderPromiseReject = prReject );var executeSuiteNav = function () var suiteNavPlaceholder = document.createElement('div');suiteNavPlaceholder.id = 'SuiteNavPlaceholder';suiteNavPlaceholder.style = "min-height: 50px";document.body.insertBefore(suiteNavPlaceholder, document.body.firstChild);if (window.o365ShellScriptLoadError) o365ShellLoadPromiseReject(window.o365ShellScriptLoadError);o365ShellRenderPromiseReject(new Error('SuiteNavLoadError'));o365ShellPostRenderPromiseReject(new Error('SuiteNavLoadError'));return; o365ShellLoadPromiseResolve();var themeData;try  themeData = JSON.parse(localStorage.getItem('odSuiteNavthemedata')).themeData; catch(err)  themeData = Primary:'#0078D4'; (typeof markPerfStage === 'function' && markPerfStage('suiteNavRenderAsyncStart'));O365Shell.RenderAsync(top: 'SuiteNavPlaceholder', layout: 'Mouse', enableSearchUX: true, initialSearchUXVisibility: true, initialSearchUXPlaceholderText: 'Search', initialSearchUXSearchText: "",enableDelayLoading: true, collapseO365Settings: true, disableDelayLoad: false, disableShellPlus: false, isThinHeader: false, enableLegacyResponsiveBehavior: false, expectSearchBoxSettings: true, shellDataOverrides: , supportShyHeaderMode: false, initialRenderData:  AppBrandTheme: themeData, Culture: 'en-US', CurrentMainLinkElementId: 'ShellDocuments', IsConsumer: false, UserDisplayName: 'JOHN DOE', UserID: '100320009e7b358d', WorkloadId: 'Sharepoint', ShellBootHost: 'https://shellprod.msocdn.com', EnableVanillaSearchBox: true ,function () (typeof markPerfStage === 'function' && markPerfStage('suiteNavRenderAsyncEnd'));o365ShellRenderPromiseResolve();,function () (typeof markPerfStage === 'function' && markPerfStage('suiteNavPostRender'));o365ShellPostRenderPromiseResolve();,function (error) (typeof markPerfStage === 'function' && markPerfStage('suiteNavRenderAsyncErrorEnd'));o365ShellRenderPromiseReject(error); o365ShellPostRenderPromiseReject(error););;
</script><script type="text/javascript" nonce="55c3d852-fe79-49b0-927d-e793a0ba3192">
    var params = window.location.search.substring(1).split('&') || [];
var shouldExecuteSuiteNav = true;
shouldExecuteSuiteNav &= params.indexOf('p=2') === -1;
shouldExecuteSuiteNav &= params.indexOf('cl=true') === -1;
shouldExecuteSuiteNav &= params.filter(function (x)  return x.indexOf('parent') === 0; ).length === 0;
try  shouldExecuteSuiteNav &= window.parent === window;  catch(err)  shouldExecuteSuiteNav = false; 
if (shouldExecuteSuiteNav)  executeSuiteNav(); 
</script>
  </body>



  
  
      <script type="text/javascript">
      try 
          (function() 
              var a = navigator.userAgent.toLowerCase();
              var i = a.indexOf("msie");
              if (-1 !== i) 
                  var v = parseInt(a.substring(i + 5));
                  if (v <= 8 && Boolean(document.documentMode) && document.documentMode <= 8) 
                      var d = new Date(); d.setTime(d.getTime() + 31536000000);
                      document.cookie = "odbnu=0;expires=" + d.toUTCString() + ";path=/";
                      window.location.href = window.location.href.replace(/\/onedrive\.aspx/i, '/start.aspx#/Documents/Forms/All.aspx');
                  
              
          )();
       catch(e) 
      </script>
      <script type="text/javascript" nonce="55c3d852-fe79-49b0-927d-e793a0ba3192">
       SOME PRIVATE STUFF HERE
</script><link rel="preconnect" href="https://spoprod-a.akamaihd.net" crossorigin /><script type="text/javascript">
    !function()if('PerformanceLongTaskTiming' in window)var g=window.__tti=e:[];g.o=new PerformanceObserver(function(l)g.e=g.e.concat(l.getEntries()));g.o.observe(entryTypes:['longtask'])();
</script><script type="text/javascript">
    var g_responseEnd = new Date().getTime();window['FabricConfig'] =  fontBaseUrl: '';window['__odsp_culture'] = 'en-us';window['__odspSriHashes'] = "listviewdataprefetch-mini-c82c051f.js":"sha256-GCNR9Rk+cuSJfvbszuhs5ZBaUs5tQ2RdzzJTteHOXGk=","reactandknockout-mini-584215d6.js":"sha256-ICjqvvD9qHiKbj5xYFNGC/JsgNcqNRRL1t3kW4RVioI=","aria-mini-2e5a74c4.js":"sha256-CbCwYga9yHE+t1OvB+NHHDdH2rxSfY6KJkCMiUpXQjw=","spectreviewer-mini-9c641fce.js":"sha256-tqmAhKxEONjZOpZuGrbo8VdnLx6kRH+Xfhjrcchv2+4=","babylonjs-mini-22e57381.js":"sha256-T6IgL4CdkolwNC0L4tG6d+G07Bhuc7bI1pSIShdrTUk=","sp-http_odb-mini-21a5eb98.js":"sha256-mTfdqB83ALG/d2z8krhrUugjXBzFQ/bzPfUIgcayACg=","onedriveappfontsplt-mini-ce0e18ec.js":"sha256-+ockQ4cjstrmVqBPVRH8C9Z9M0ZJbyQxHQ/cm/ukBOI=","onedriveappfontsdeferred-mini-3771cbb9.js":"sha256-qXZjhCWJDNPCbbXRIwDt1cqIyqzQKqROnwdASmSsoGw=","odbonedriveapp-mini-11081db7.js":"sha256-j/CkxuEVbtMOL5PRKZ05dZURZ/aNH9tk6vnMj6ei/lk=","en-us/
</script><script type="text/javascript">
    window['moduleNameMapping']="odsp-next/providers/operation/OperationProvider":"Rq";
</script><script type="text/javascript" data-import-link="https://spoprod-a.akamaihd.net/files/odsp-common-library-prod_2019-02-15_20190219.002/require.js" id="requireJsString">
    SOME VERY LONG FUNCTION CODE
</script><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/listviewdataprefetch-mini-c82c051f.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/reactandknockout-mini-584215d6.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/odbonedriveapp-mini-11081db7.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/en-us/odbonedriveapp-mini.resx-7f957d5c.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/odbonedrive-mini-5e8b1855.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/en-us/odbonedrive-mini.resx-374bb468.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/odbfiles-mini-9aaee23c.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/en-us/odbfiles-mini.resx-250da06d.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/odbitemsscope-mini-5070e33c.js" rel="preload" crossorigin="anonymous" as="script" /><link href="https://spoprod-a.akamaihd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/en-us/odbitemsscope-mini.resx-ff223e24.js" rel="preload" crossorigin="anonymous" as="script" /><script type="text/javascript" id="requireConfig">
    
!function()
    var backupBaseUrl = 'https://az741266.vo.msecnd.net/files/odsp-next-prod-amd_2020-06-12_20200612.001/';
    window.__backupBaseUrl = backupBaseUrl;
    var failOverState = window.__cdnFailOverState = 
        baseUrlFailedOver: false,
        modulesFalledBack: []
    ;
    function processConfigToSupportFailOver(config) 
        var paths = ;
        for (var bundleId in config.bundles) 
            var bundlePath = config.paths[bundleId];
            var fallbackPaths = [bundlePath, backupBaseUrl + bundlePath];
            for (var _i = 0, _a = config.bundles[bundleId]; _i < _a.length; _i++) 
                var moduleName = _a[_i];
                paths[moduleName] = fallbackPaths;
            
        
        return 
            paths: paths,
            shim: config.shim,
            deps: config.deps,
            baseUrl: config.baseUrl,
            waitSeconds: config.waitSeconds,
            onNodeCreated: config.onNodeCreated,
            enforceDefine: config.enforceDefine,
            onPathFallback: function (options) 
                var moduleId = options.moduleId;
                var config = options.config;
                if (moduleId && config && config.deps && config.deps.indexOf(moduleId) >= 0) 
                    var failedModules = failOverState.modulesFalledBack;
                    failedModules.push(moduleId);
                    if (!failOverState.baseUrlFailedOver && failedModules.length >= 2) 
                        require.config(
                            baseUrl: backupBaseUrl
                        );
                        failOverState.baseUrlFailedOver = true;
                    
                
            
        ;
    
    var config = paths:"listviewdataprefetch-mini":"listviewdataprefetch-mini-c82c051f","reactandknockout-mini":"reactandknockout-mini-584215d6","aria-mini":"aria-mini-2e5a74c4","spectreviewer-mini":"spectreviewer-mini-9c641fce","babylonjs-mini":"babylonjs-mini-22e57381","sp-http_odb-mini":"sp-http_odb-mini-21a5eb98","onedriveappfontsplt-mini":"onedriveappfontsplt-mini-ce0e18ec","onedriveappfontsdeferred-mini":"onedriveappfontsdeferred-mini-3771cbb9","odbonedriveapp-mini":"odbonedriveapp-mini-11081db7","odbonedriveapp-mini.resx":"en-us/odbonedriveapp-mini.resx-7f957d5c","odbonedrive-mini":"odbonedrive-mini-5e8b1855","odbonedrive-mini.resx":"en-us/odbonedrive-mini.resx-374bb468","odbbasepage-mini":"odbbasepage-mini-8d7dea71","odbfiles-mini":"odbfiles-mini-9aaee23c","odbfiles-mini.resx":"en-us/odbfiles-mini.resx-250da06d","odbuploadmanager-mini":"odbuploadmanager-mini-168f0ee8","odbuploadmanager-mini.resx":"en-us/odbuploadmanager-mini.resx-660b735c","odbreactcontrols-mini":"odbreactcontrols-mini-6f323ced","odbreactcontrols-mini.resx":"en-us/odbreactcontrols-mini.resx-c7ec26e2","odbdeferred-mini":"odbdeferred-mini-b9def3da","odbdeferred-mini.resx":"en-us/odbdeferred-mini.resx-d1f98f82","odblivepersonapicker-mini":"odblivepersonapicker-mini-414c6f81","odbdebugwindow-mini":"odbdebugwindow-mini-2f4ef22c","odbfilepicker-mini":"odbfilepicker-mini-2f5a2203","odbfilepicker-mini.resx":"en-us/odbfilepicker-mini.resx-3562db06","odbembed-mini":"odbembed-mini-8638d6c3","odboneup-mini":"odboneup-mini-3086899d","odboneup-mini.resx":"en-us/odboneup-mini.resx-a7d40d5e","odbpdf-mini":"odbpdf-mini-7d046eb1","odbpdf-mini.resx":"en-us/odbpdf-mini.resx-e5e07b77","odbwrs-mini":"odbwrs-mini-2c0b0a8b","odbsharepage-mini":"odbsharepage-mini-e62fc2f8","odbtextfileeditor-mini":"odbtextfileeditor-mini-000ede78","odbtextfileeditor-mini.resx":"en-us/odbtextfileeditor-mini.resx-259dbac3","odbfilerequestpage-mini":"odbfilerequestpage-mini-db0e14b3","odbfilerequestpage-mini.resx":"en-us/odbfilerequestpage-mini.resx-8e83db21","odbtiles-mini":"odbtiles-mini-a111ffa2","odbtiles-mini.resx":"en-us/odbtiles-mini.resx-4fae993b","odbsites-mini":"odbsites-mini-c5563389","odbsites-mini.resx":"en-us/odbsites-mini.resx-1b3b4aeb","odbitemvideoplayer-mini":"odbitemvideoplayer-mini-b7a61bf1","odbitemvideoplayer-mini.resx":"en-us/odbitemvideoplayer-mini.resx-983d47a8","odbexecutors-mini":"odbexecutors-mini-f93c0ada","odbexecutors-mini.resx":"en-us/odbexecutors-mini.resx-853081e6","odbdeferredcontrols-mini":"odbdeferredcontrols-mini-29643ad1","odbdeferredcontrols-mini.resx":"en-us/odbdeferredcontrols-mini.resx-d50ca5ed","odbnotifications-mini":"odbnotifications-mini-04da08b9","odbpushchannel-mini":"odbpushchannel-mini-38d90d10","odberror-mini":"odberror-mini-12596c1d","odberror-mini.resx":"en-us/odberror-mini.resx-cf31139d","odbrestore-mini":"odbrestore-mini-950ba62f","odbrestore-mini.resx":"en-us/odbrestore-mini.resx-3a5cbe8e","odbsettingsbasepage-mini":"odbsettingsbasepage-mini-d6c5acdd","odbsettingsbasepage-mini.resx":"en-us/odbsettingsbasepage-mini.resx-b5949852","odbsettings-mini":"odbsettings-mini-ddeab1d1","odbitemsscope-mini":"odbitemsscope-mini-5070e33c","odbitemsscope-mini.resx":"en-us/odbitemsscope-mini.resx-ff223e24","odbitemsscopedeferred-mini":"odbitemsscopedeferred-mini-f918897a","odbitemsscopedeferred-mini.resx":"en-us/odbitemsscopedeferred-mini.resx-af61a995","odbmobileappupsellbasepage-mini":"odbmobileappupsellbasepage-mini-723e546a","odbemptyfolderroot-mini":"odbemptyfolderroot-mini-f9f096eb","odbwinappcommunicator-mini":"odbwinappcommunicator-mini-60ab2c1a","odbcreatesite-mini":"odbcreatesite-mini-5400c9ec","odbcreatesite-mini.resx":"en-us/odbcreatesite-mini.resx-d9c236d6","odb-functional-tests-mini":"odb-functional-tests-mini-41e66bd6","odbhighcharts-mini":"odbhighcharts-mini-ce7056aa","odbclientform-mini":"odbclientform-mini-106b2b9f","odbclientform-mini.resx":"en-us/odbclientform-mini.resx-356af9e8","odbfloodgate-mini":"odbfloodgate-mini-061846b3","odbfloodgate-mini.resx":"en-us/odbfloodgate-mini.resx-610e7422","odbpowerapps-mini":"odbpowerapps-mini-c5977eac","msflowsdk":"msflowsdk-8689f64f","power-app":"power-app-86d2bb4d","directional-navigation":,deps:["bL3","f","bvB","a6o","buW","buZ","bfi"],baseUrl:"https:\u002f\u002fspoprod-a.akamaihd.net\u002ffiles\u002fodsp-next-prod-amd_2020-06-12_20200612.001\u002f",waitSeconds:0,onNodeCreated:function(n,c,m,u) 
n.setAttribute("crossorigin","anonymous");
var urlParts = u.split('/');
var fileName = urlParts[urlParts.length - 1];
var odspSriHashes = window.__odspSriHashes;
var integrity = odspSriHashes && (odspSriHashes[window.__odsp_culture + '/' + fileName] || odspSriHashes[fileName]);
if (integrity) 
    n.setAttribute("integrity",integrity);

,enforceDefine:true;
    var newConfig = processConfigToSupportFailOver(config);
    require.config(newConfig);
();

</script><script type="text/javascript">
    window["_spModuleLink"]="buildNumber":"odsp-next-prod-amd_2020-06-12_20200612.001","manifestName":"ODBOneDrive","scenarioName":"ODBOneDrive","usingRedirectCookie":false,"bugLinkFormat":null,"ulsLinkFormat":null;
</script>
      
  

</html>
<script type="text/javascript" nonce="55c3d852-fe79-49b0-927d-e793a0ba3192">
    var g_duration = 92;
var g_iisLatency = 2;
var g_cpuDuration = 72;
var g_queryCount = 6;
var g_queryDuration = 18;
var g_requireJSDone = new Date().getTime();
</script><script type="text/javascript">
var _spOneDrivePageDataCache = "SPHomeWeb:sites/feed":"cacheContext":"ListItemId":3,"Hash":null,"MySiteUrl":null,"Time":"2020-05-28T15:24:51.0000000Z","Version":null,"cacheValue":null,"ODBWeb.sites/feed":"cacheContext":"ListItemId":4,"Hash":"7iItaPeKRTNyNthQTkF2/CvVyjcOTjNOkCsKnNsKarY=","MySiteUrl":null,"Time":"2020-05-28T15:25:03.0000000Z","Version":"1.0","cacheValue":"\"Items\":[],\"Type\":\"ItemsList\"","ODBWeb.substrate.recommended":"cacheContext":"ListItemId":5,"Hash":null,"MySiteUrl":null,"Time":"2020-05-28T15:24:51.0000000Z","Version":null,"cacheValue":null;

</script>
<script type="text/javascript" nonce="55c3d852-fe79-49b0-927d-e793a0ba3192">
    var g_deferDataLoadTime = new Date().getTime();var g_payload = "parameters":"__metadata":"type":"SP.RenderListDataParameters","RenderOptions":1513223,"AllowMultipleValueFilterForTaxonomyFields":true, "AddRequiredFields":true; var g_listData = "wpq":"","Templates":,"ListData": "Row" : 
[] OTHER SETTINGS WITH PRIVATE STUFF...
;if (typeof DeferredListDataComplete != "undefined" && DeferredListDataComplete)  DeferredListDataComplete(); 
</script>

【讨论】:

【参考方案10】:

我建议修改pdf.js:去掉下载按钮,将pdf(在后端部分)转换为pdf.js的一些中间格式,并在服务器端放水印。

【讨论】:

【参考方案11】:

在我看来,另一个建议的解决方案是。

    将您的 PDF 图书转换为 HTML, 在 Iframe 中显示 html 书籍

这种方法会阻止用户下载文件。

【讨论】:

【参考方案12】:
    将 pdf 转换为图像。 使用图片标签显示图片。 禁止右键单击图像。

【讨论】:

然后用户可以 (1) 按 F12 打开浏览器开发工具,(2) 检查网络流量以查看图像文件的响应,(3) 将该请求 URL 复制到新的浏览器窗口中, (4) 下载图像,(5) 右键单击​​并打印/保存图像.......再次挫败,蝙蝠侠。 给出的信息很少,例如如何“禁用右键单击图像”?无论如何,这种方法并不是防止 下载 PDF 的保证解决方案。 @ThiagoSilva 比这更简单。使用 Firefox 和 Shift+RightClick 强制显示浏览器的默认上下文菜单。 Firefox 的设计理念是它运行在最终用户的计算机上,而不是网站开发者的计算机上。 (您只能覆盖右键单击,因为它有合法用途,例如实现自定义上下文菜单......并且正在努力淘汰该特定示例。)

以上是关于阻止 PDF 文件下载和打印的主要内容,如果未能解决你的问题,请参考以下文章

如何打开放置在iframe html中直接访问阻止目录中的pdf文件

PDF文件如何设置权限,使得别人不能修改和打印?

pdf格式文件打印为啥很慢?

pdf文件不大但打印时非常大,打印很慢,如何解决

pdf文件怎么把打印权限

CAD图纸怎么输出打印成PDF文件