【问题标题】:How to embed a Base64 encoded PDF data URI into a HTML 5 `<object>` data attribute?如何将 Base64 编码的 PDF 数据 URI 嵌入 HTML 5 `<object>` 数据属性?
【发布时间】:2015-07-15 21:27:52
【问题描述】:

所以在我的应用程序中,用户可以选择将文件上传到&lt;input type = "file" id = "my-file"&gt;(HTML 5 文件输入)。我随后可以使用以下 Javascript 获取此文件:

var files = $("#my-file").files;
var file = files[0];

我能否以某种方式将此var file 用作&lt;object&gt; 标签中的data?这是一个对象标签示例,其中通过点击 URL 并联系服务器来获取 PDF。

<object data="data/test.pdf" /*<-- I want the var file here */ type="application/pdf" width="300" height="200">
</object>

我怎样才能做到这一点?请注意,我必须支持 Internet Explorer 11。

更新:

我尝试了一些最终以失败告终的方法。我使用 FileReader 将 PDF 转换为 data-uri,然后在 &lt;object&gt; 标记的 data 属性中使用它,它在 Chrome 中完美呈现,但在 Internet Explorer 中却完全不呈现。

var files = $(e.currentTarget.files);
file = files[0];
var reader = new FileReader();
reader.onloadend = function() {
    var data = reader.result;
    console.log(data);
    $("#content").prepend('<object id="objPdf" data="'+data+'" type="application/pdf"></object>');
};
reader.readAsDataURL(file);

读取器数据的输出如下:

data:application/pdf;base64,JVBERi0xLjQKJe...

Here is the reason PDF's don't work with this approach in Internet Explorer(只有图片)...好伤心:(

更新 2:

尝试pdf.js 取得了一些成功...它在页面上显示 PDF,尽管在 Internet Explorer 11 中它非常慢(单页 5 秒)。它一次也只显示一页,而&lt;object&gt; 标签在一个漂亮的可滚动容器中立即显示所有页面。虽然这是一个极端的后备选项,但我不想走这条路。

关于如何预览用户直接在网页中上传的 PDF,任何人有任何其他想法吗?

【问题讨论】:

  • 可以只使用 fileReader API,将数据包装在 $() 中,去掉脚本标签并将正文中的任何内容注入 div 甚至将所有内容放入 iframe
  • 你能用一些代码示例详细说明一下吗?我尝试了 data-uri 方法,将其用作 iframe 的源,但 iframe 最终创建了一个嵌入标签,其中不支持 Internet Explorer 中的 PDF。
  • 您只需要原始 html,不需要 data-uri。一旦 iFrame 加载或 document.write 整个内容,如果它包含 &lt;html&gt; 标签,则使用 html 设置 body 的 innerHTML
  • 抱歉,我想我遗漏了一些东西。用什么HTML设置body的innerHTML? &lt;object&gt; 标签?为了清楚起见,我想将&lt;object&gt; 中的数据与var file 中的数据一起使用,我从用户输入中获得,而不是从从服务器抓取的文件中获得。
  • 我可能误解了原始问题。我认为这是标题中的 html 文件。这是不正确的吗?

标签: html pdf base64 data-uri object-tag


【解决方案1】:

是的,我得到了它与文件一起使用...

HTML:

<object id="pdf" data="" type="application/pdf"></object>

Javascript (Jquery)

var fr = new FileReader();
fr.onload = function(evtLoaded) {
  $('#pdf').attr('data', evtLoaded.target.result );
};
fr.readAsDataURL(inFile);

与您的方法相比,我通过使用事件以不同方式使用“我已完成读取文件”回调。 如果我做对了:无论读取成功还是失败,都会调用'loadend'。

2021 年 8 月 4 日的附录:
@Adil 谈到了 PDF 的复数形式。好吧,这个解决方案谈到了 1,我从未尝试过几个 PDF。由于解决方案是由 html 'id' 生成的,我们知道 'id' 带有每页的单例模式。尽管如此,我相信无论创建什么用例,每页都有 severla PDF 是可行的。

@netotz 我没有在这里调查。我只是想到它可能会涉及到有关硬件的问题。你没有提到它发生的浏览器,也没有提到任何操作系统内部......我只是猜测(虽然我可能是错的)1.8 MB 是相当少量的数据......

【讨论】:

  • &lt;object&gt; 不会呈现所有 pdf 文件。我在渲染一些特定的 pdf 时遇到了问题。
  • 我也遇到了问题,尤其是大小 >1 MB,但我不确定限制,我可以渲染 1 MB 的文件,但不能渲染 1.8 MB
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 2012-03-07
  • 2016-02-29
  • 2017-04-22
  • 2015-05-01
  • 2011-04-04
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多