使用 pdf.js 阻止 idm 自动下载 PDF

Prevent PDF auto download by idm using pdf.js

我正在使用 PDF.Js 嵌入 PDF 文件进行预览,并且我从 viewer.js 中删除了下载和打开文件的脚本,但是当我测试页面和 PDF 文件时尝试显示,Internet 下载管理器下载它并中止预览.. 搜索后我发现使用 object 而不是 iframe 可能会解决问题,但它不起作用 pdf 查看器显示为白色,什么我可以做些什么来防止自动下载吗?或使用其他方式(插件)显示 PDF 文件内容。

<iframe 
  class="pdf" 
  webkitallowfullscreen="" 
  mozallowfullscreen="" 
  allowfullscreen="" 
  frameborder="no" 
  width="'.$width.'" 
  height="'.$height.'" 
  src="'.$baseurl.'/assets/pdf/web/viewer.html?file='.urlencode($pdf_url).'" 
  data-src="'.$pdf_url.'">
  '.$pdf_url.'
</iframe>

试试这个

<embed src="'.$baseurl.'/assets/pdf/web/viewer.html?file='.urlencode($pdf_url).'" type="text/html" >

从您的评论来看,我认为您的 uri 可能不正确。
您可以尝试将 uri 替换为任何在线 pdf 文件,以查看其余代码是否正常。

如果您只想嵌入一个 PDF 对象,您可以尝试使用 PDFobject.js。
https://github.com/pipwerks/PDFObject
http://pdfobject.com/instructions.php

HTML

<div id="my_pdf_object"
  class="pdf" 
  webkitallowfullscreen="" 
  mozallowfullscreen="" 
  allowfullscreen="" 
  frameborder="no" 
  width="'.$width.'" 
  height="'.$height.'" 
>
  It appears you don't have Adobe Reader or PDF support in this web browser. 
  <a href="'.$baseurl.'/assets/pdf/web/viewer.html file='.urlencode($pdf_url).'">
  Click here to download the PDF</a>
</div>

JavaScript

<script type="text/javascript">
  //loads pdf files for resume
  window.onload = function (){
    var success = new PDFObject({ 
      url: "'.$baseurl.'/assets/pdf/web/viewer.html?file='.urlencode($pdf_url).'" 
    }).embed("my_pdf_object");
  };
</script>

这与开发问题无关,这与用户特定环境有关。

问题:

使用 IDM ,任何以媒体扩展名结尾的 URL (例如 *.JPG 、 *.PNG 、 *.MP4 、 *.WMV 、 *. PDF ..etc) 将被自动下载,但是另一方面,如果用户没有安装 IDM,该文件将立即在浏览器中查看 window.

可能的解决方案:

  1. 从 IDM 中删除 PDF 扩展处理程序,以防止自动下载,我认为图像解释得很好。

  1. 修改您的 PDF 的响应 header link 以强制您的浏览器在其视图中查看 pdf,请考虑每个浏览器处理响应的方式可能不同,可以找到有关此方法的更多详细信息here.

最后的注释:

As a developer you shouldnt handle each user specific environment , we suppose that when user installs a specific app to handle generic files , then it is his/her role to handle that application , and not the developer role , cause if you follow this algorithm you jump inside infinite loop handling different users specific setup.

可以防止从 idm (PdfJs) 自动下载。 IDM 找到扩展名 pdf 文件,所以我们需要将 pdf 文件转换为 base-64,然后将 pdf 的 base64 读入节点 DOM src:

1.将您的文件 pdf 转换为 base64

document.getElementById('myfiles').addEventListener('change', function(event){

  var input = document.getElementById("myfiles"); 

  var fReader = new FileReader();
  fReader.readAsDataURL(input.files[0]);
  fReader.onloadend = function(event){ 
    document.getElementById("base64").innerHTML = event.target.result;
   console.log(event.target.result); 
     
  }
 });
<input type="file" name="files" id="myfiles" value=""><br>
<textarea id="base64" cols="50"></textarea>

2。将所有字符串 base64 放入 txt 文件

filename.txt

3。从文件 txt 读取 base64 并传递到 iframe 或使用 viewer.js (PDF JS)

-iframe应该

<iframe scr="data:application/pdf,base64.....">prevent download from idm</iframe>

-使用 PDF 查看器

 var xhr = new XMLHttpRequest();
     console.log(file);
     xhr.open('GET', folderFiles+filename+".txt", true);
     xhr.responseType = 'text';
     xhr.onload = function(e) {
     
        if (this.status == 200) {
     
           PDFViewerApplication.open(this.response);     
        
        }
      };

因此,IDM 不会因为找不到特定文件而自动强制下载 pdf 文件。 link : https://github.com/sokhasen/ViewerPDF.git

只需从主文件中删除 .pdf 扩展名。 IDM 无法检测到它是什么类型的文件。但浏览器将以其本机方式处理。

我建议您使用php删除文件扩展名然后使用viewer.html?file=file_path&name查看pdf而不被idm拦截:

$fileinfo = pathinfo($book['file']);
$path_pdf=$fileInfo['dirname'];
$name_pdf=$fileInfo['filename'];
header('location: viewer.html?file='.$path_pdf.'/'.$name_pdf.'');

只需使用 <embed /> 替换 <iframe /> 即可防止自动下载