在 HTML 中嵌入 PDF 的推荐方法是什么?
框架?
目的?
嵌入?
Adobe 是怎么说的?
就我而言,PDF 是动态生成的,因此在刷新之前无法将其上传到第三方解决方案。
这快速、简单、切中要害,并且不需要任何第三方脚本:
<embed src="http://example.com/the.pdf" width="500" height="375"
type="application/pdf">
更新(2021 年 2 月 3 日)
Adobe 现在提供它自己的 PDF 嵌入 API。
https://www.adobe.io/apis/documentcloud/dcsdk/pdf-embed.html
更新(1/2018):
Android 上的 Chrome 浏览器不再支持 PDF 嵌入。您可以使用 Google Drive PDF 查看器解决此问题
<embed src="https://drive.google.com/viewerng/
viewer?embedded=true&url=http://example.com/the.pdf" width="500" height="375">
最好的方法可能是使用 PDF.JS 库。它是用于 PDF 文档的纯 HTML5/JavaScript 渲染器,无需任何第三方插件。
在线演示:https://mozilla.github.io/pdf.js/web/viewer.html
GitHub:https://github.com/mozilla/pdf.js
<object>
不同:github.com/mozilla/pdf.js/blob/master/examples/helloworld/…
为此,您还可以使用 Google PDF 查看器。据我所知,这不是谷歌的官方功能(我错了吗?),但它对我来说非常顺利和顺利。您需要先在某处上传您的 PDF,然后使用它的 URL:
<iframe src="http://docs.google.com/gview?url=http://example.com/mypdf.pdf&embedded=true" style="width:718px; height:700px;" frameborder="0"></iframe>
重要的是它不需要 Flash 播放器,它使用 JavaScript。
public
、sign-in required
和 private
之间设置任何 Google 文档的隐私。考虑到 Google Docs 上的任何文档都有 embed
选项,这绝对是一项官方功能。
您可以通过在查询字符串中传递一些选项来控制 PDF 在浏览器中的显示方式。我很高兴这项工作,直到我意识到它在 IE8 中不起作用。 :(
它适用于 Chrome 9 和 Firefox 3.6,但在 IE8 中会显示消息“如果无法显示 PDF,请在此处插入错误消息”。
不过,我还没有测试过上述任何浏览器的旧版本。但无论如何,这是我拥有的代码,以防它帮助任何人。这会将缩放设置为 85%,删除滚动条、工具栏和导航窗格。如果我确实遇到在 IE 中也有效的东西,我会更新我的帖子。
<object width="400" height="500" type="application/pdf" data="/my_pdf.pdf?#zoom=85&scrollbar=0&toolbar=0&navpanes=0">
<p>Insert your error message here, if the PDF cannot be displayed.</p>
</object>
同时使用 <object>
和 <embed>
将为您提供更广泛的浏览器兼容性。
<object data="http://yoursite.com/the.pdf" type="application/pdf" width="750px" height="750px">
<embed src="http://yoursite.com/the.pdf" type="application/pdf">
<p>This browser does not support PDFs. Please download the PDF to view it: <a href="http://yoursite.com/the.pdf">Download PDF</a>.</p>
</embed>
</object>
embed
标记视为 unsafe
。
查看此代码 - 将 PDF 嵌入 HTML
<!-- Embed PDF File -->
<object src="YourFile.pdf" type="application/pdf" title="SamplePdf" width="500" height="720">
<a href="YourFile.pdf">shree</a>
</object>
src
切换为 data
确实有效。
通过 ImageMagick 将其转换为 PNG,并显示 PNG(又快又脏)。
<?php
$dir = '/absolute/path/to/my/directory/';
$name = 'myPDF.pdf';
exec("/bin/convert $dir$name $dir$name.png");
print '<img src="$dir$name.png" />';
?>
如果您需要快速解决方案,想要避免跨浏览器 PDF 查看问题,并且 PDF 只有一两页,这是一个不错的选择。当然,您需要在 Web 服务器上安装 ImageMagick(而这又需要 Ghostscript),该选项在共享托管环境中可能不可用。还有一个可以工作的 PHP 插件(称为 imagick)like this,但它有自己的特殊要求。
foreach($pdf->pages as $page)
并为每个页面创建一个图像
您可以像这样使用保存的 pdf 的相对位置:
示例 1
<embed src="example.pdf" width="1000" height="800" frameborder="0" allowfullscreen>
示例 2
<iframe src="example.pdf" style="width:1000px; height:800px;" frameborder="0" allowfullscreen></iframe>
我们的问题是,出于法律原因,我们不允许将 PDF 临时存储在硬盘上。此外,在浏览器中将 PDF 显示为预览时,不应重新加载整个页面。
首先我们尝试了 PDF.jS。它在 Firefox 和 Chrome 的查看器中与 Base64 配合使用。但是,对于我们的 PDF,它的速度慢得令人无法接受。 IE/Edge 根本不起作用。
因此,我们尝试在 HTML 对象标签中使用 Base64 字符串。这同样不适用于 IE/Edge(可能与 PDF.js 的问题相同)。在 Chrome/Firefox/Safari 中再次没有问题。这就是我们选择混合解决方案的原因。 Edge 我们使用 IFrame,所有其他浏览器使用 object-tag。
IFrame 解决方案当然也适用于 Chrome 和 co。我们没有为 Chrome 使用此解决方案的原因是,虽然 PDF 显示正确,但 Chrome 会在您单击预览中的“下载”时立即向服务器发出新请求。不再设置所需的隐藏字段 pdfHelperTransferData(用于发送生成 PDF 所需的表单数据),因为 PDF 显示在 IFrame 中。有关此功能/错误,请参阅 Chrome sends two requests when downloading a PDF (and cancels one of them)。
现在问题子IE9和IE10仍然存在。对于这些,我们放弃了预览解决方案,只是通过单击预览按钮将文档作为下载发送给用户(而不是预览)。我们已经尝试了很多,但即使我们找到了解决方案,为这小部分用户付出的额外努力也不值得。您可以在此处找到我们的下载解决方案:Download PDF without refresh with IFrame。
我们的 Javascript:
var transferData = getFormAsJson()
if (isMicrosoftBrowser()) {
// Case IE / Edge (because doesn't recoginzie Pdf-Base64 use Iframe)
var form = document.getElementById('pdf-helper-form');
$("#pdfHelperTransferData").val(transferData);
form.target = "iframe-pdf-shower";
form.action = "serverSideFunctonWhichWritesPdfinResponse";
form.submit();
} else {
// Case non IE use Object tag instead of iframe
$.ajax({
url: "serverSideFunctonWhichRetrivesPdfAsBase64",
type: "post",
data: { downloadHelperTransferData: transferData },
success: function (result) {
$("#object-pdf-shower").attr("data", result);
}
})
}
我们的 HTML:
<div id="pdf-helper-hidden-container" style="display:none">
<form id="pdf-helper-form" method="post">
<input type="hidden" name="pdfHelperTransferData" id="pdfHelperTransferData" />
</form>
</div>
<div id="pdf-wrapper" class="modal-content">
<iframe id="iframe-pdf-shower" name="iframe-pdf-shower"></iframe>
<object id="object-pdf-shower" type="application/pdf"></object>
</div>
要检查 IE/Edge 的浏览器类型,请参见此处:How can I detect Internet Explorer (IE) and Microsoft Edge using JavaScript?我希望这些发现可以节省其他人的时间。
创建一个容器来保存您的 PDF
告诉 PDFObject 要嵌入哪个 PDF,以及在哪里嵌入它 您可以选择使用 CSS 指定视觉样式,包括尺寸、边框、边距等。pdf.output('bloburl')
一起使用,但它似乎不适用于 IE11。
Scribd 不再要求您将文档托管在他们的服务器上。如果您与他们创建一个帐户,那么您将获得一个发布者 ID。只需几行 JavaScript 代码即可加载存储在您自己的服务器上的 PDF 文件。
有关详细信息,请参阅 Developer Tools。
更新 - Adobe PDF 嵌入 API
Adobe 发布了完全免费的 Adobe PDF Embed API。因为他们自己创建了 PDF 格式,所以他们的 API 可能是最适合的。
它提供了可用的最高质量的 PDF 渲染。
您可以完全自定义用户体验并选择如何显示 PDF。
您还将对 PDF 的使用进行分析,以便了解用户如何与 PDF 交互,包括在页面上花费的时间和搜索。
您所要做的就是创建一个 api_key
并在代码段中使用它。
通过 file_url 显示 PDF
下面是代码片段示例,您可以将其添加到 HTML 中,并利用他们的 API 通过 file_url
显示 PDF。您必须添加 { location: { url: "url_of_the_pdf" } }
配置。
<div id="adobe-dc-view"></div>
<script src="https://documentcloud.adobe.com/view-sdk/main.js"></script>
<script type="text/javascript">
document.addEventListener("adobe_dc_view_sdk.ready", function(){
var adobeDCView = new AdobeDC.View({clientId: "api_key", divId: "adobe-dc-view"});
adobeDCView.previewFile({
content: { location: { url: "url_of_the_pdf" } },
metaData: { fileName: "file_name_to_display" }
}, {});
});
</script>
将 PDF 显示为缓冲区
这是代码片段的示例,您可以将其添加到 HTML 中,如果您有缓冲区(例如本地文件),则可以利用它们的 API 来显示 PDF。您必须添加 { promise: <FILE_PROMISE> }
配置。
<div id="adobe-dc-view"></div>
<script src="https://documentcloud.adobe.com/view-sdk/main.js"></script>
<script type="text/javascript">
document.addEventListener("adobe_dc_view_sdk.ready", function(){
var adobeDCView = new AdobeDC.View({clientId: "api_key", divId: "adobe-dc-view"});
adobeDCView.previewFile({
content: { promise: <FILE_PROMISE> }
metaData: { fileName: "file_name_to_display" }
}, {});
});
</script>
PdfToImageServlet 使用 ImageMagick 的 convert
命令。
使用示例:<img src='/webAppDirectory/PdfToImageServlet?pdfFile=/usr/share/cups/data/default-testpage.pdf'>
这就是我对 AXIOS 和 Vue.js 所做的方式:
axios({
url: `urltoPDFfile.pdf`,
method: 'GET',
headers: headers,
responseType: 'blob'
})
.then((response) => {
this.urlPdf = URL.createObjectURL(response.data)
})
.catch((error) => {
console.log('ERROR ', error)
})
将 urlPDF 动态添加到 HTML:
<object width='100%' height='600px' :data='urlPdf' type='application/pdf'></object>
<object width="400" height="400" data="helloworld.pdf"></object>
我不得不使用 React 预览 PDF,所以在尝试了几个库之后,我的最佳解决方案是获取数据并使用它。
const pdfBase64 = //fetched from url or generated with jspdf or other library
<embed
src={pdfBase64}
width="500"
height="375"
type="application/pdf"
></embed>
要将文件流式传输到浏览器,请参阅 Stack Overflow 问题 How to stream a PDF file as binary to the browser using .NET 2.0 - 请注意,只要有细微的变化,无论您是从文件系统提供文件还是动态生成文件,这都应该有效。
话虽如此,引用的 MSDN 文章对世界的看法相当简单,因此您可能还需要阅读 Successfully Stream a PDF to browser through HTTPS 以了解您可能需要提供的一些标头。
使用这种方法,iframe 可能是最好的方法。有一个流式传输文件的网络表单,然后将 iframe 放在另一个页面上,并将其 src
属性设置为第一个表单。
您应该考虑的选项之一是 Notable PDF 它有一个免费计划,除非您计划在 pdf 上进行实时在线协作
将以下 iframe
嵌入任何 html 并享受结果:
<iframe width='1000' height='800' src='http://bit.ly/1JxrtjR' frameborder='0' allowfullscreen></iframe>
构造一个输入 PDF 字节的 blob 使用一个 iframe 和 PDF.js 修补了这个跨浏览器解决方法
iframe 的 URI 应如下所示:
/viewer.html?file=blob:19B579EA-5217-41C6-96E4-5D8DF5A5C70B
现在 FF、Chrome、IE 11 和 Edge 都在通过 URL 中的标准 blob URI 传递的 iframe 中的查看器中显示 PDF。
由于 URI 限制,在嵌入使用 PDF 编码的 base64 时遇到问题之前,任何超过 2MB 的文件都无法在 Chrome 上正确呈现。
我的解决方案是:
将 uri 编码为 Blob:基于 Blob 生成临时 DOM 字符串。常量 blob = dataURItoBlob(this.dataUrl); var temp_url = window.URL.createObjectURL(blob);确定要将 iframe 附加到 DOM 的位置: const target = document.querySelector(targetID); target.innerHTML = `
<embed src="data:application/pdf;base64,..."/>
只需将 iFrame 用于 PDF。
我的 React.js 应用程序有特定需求,尝试了数百万种解决方案,但最终得到了 iFrame :) 祝你好运!
如果您不想自己托管 PDF,或者想使用其他安全功能(例如阻止用户下载 PDF 文件)自定义 PDF 查看器。我推荐使用 CloudPDF。 https://cloudpdf.io
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CloudPDF Viewer</title>
<style>
body, html {
height: 100%;
margin: 0px;
}
</style>
</head>
<body style="height: 100%">
<div id="viewer" style="width: 800px; height: 500px; margin: 80px auto;"></div>
<script type="text/javascript" src="https://cloudpdf.io/viewer.min.js?version=0.1.0-beta.11"></script>
<script>
document.addEventListener('DOMContentLoaded', function(){
const config = {
documentId: 'eee2079d-b0b6-4267-9812-b6b9eadb9c60',
darkMode: true,
};
CloudPDF(config, document.getElementById('viewer')).then((instance) => {
});
});
</script>
</body>
</html>
现代“整页截图”服务或脚本现在能够生成完整 HTML 和 PDF 页面的长截图,并将它们转换为 JPG 或 PNG 文件,然后可以嵌入为 img 元素。
我发现这工作得很好,浏览器在 Firefox 中处理它。我没有检查IE...
<script>window.location='url'</script>
type='application/pdf'
到嵌入标签<object>
标记,因为它可以在无法显示 pdf 的浏览器中显示替代内容。如果需要,甚至可以将<embed>
标记放入<object>
标记中。参考:stackoverflow.com/questions/1244788/embed-vs-object