在HTML中嵌入PDF的推荐方法?


1181

将PDF嵌入HTML的推荐方法是什么?

  • iFrame?
  • 宾语?
  • 嵌入?

Adobe对此有何评价?

就我而言,PDF是动态生成的,因此在刷新之前无法将其上载到第三方解决方案。



pdf2htmlEX回购的wiki上不仅有特定解决方案的比较,而且还有一般策略的比较。另外,尽管我没有尝试过,但这似乎是一个维护过的叉子。
ShreevatsaR

Answers:


541

最好的方法可能是使用PDF.JS库。它是用于PDF文档的纯HTML5 / JavaScript渲染器,没有任何第三方插件。

在线演示:http : //mozilla.github.com/pdf.js/web/viewer.html

GitHub:https : //github.com/mozilla/pdf.js


12
如另一个答案所述,scribd实际上使用pdf2swf转换pdf文件
Peter Craig

8
我强烈建议您不要使用scribd-我刚刚在特定文档上进行了实验,而在Firefox 4中,它仅显示前3页,而在IE9中,其渲染文本错误-其偏移了页面的某些部分。因此,从技术上讲,这是越野车。此外,他们希望您订阅打印或下载文档!从本质上讲,他们正在获取以前免费的文件,并在它们周围架设付费专区。
弗兰克斯特2011年

9
PDF.js库实际上看起来是一个很好的解决方案,尽管链接的演示并未将其显示在页面中(它占据了整个页面)。但是它使用HMTL5画布,因此应该易于嵌入,并且速度很快。不利的一面是,它需要一些JS使用,不像<object>github.com/mozilla/pdf.js/blob/master/examples/helloworld/...
LarsH

33
pdf.js在平板电脑浏览器(例如Chrome)上无法正常工作。对于较大的pdf文档,我也觉得它非常非常慢。
Rocco Taco

10
我不敢相信这是值得推荐的。看看在线演示中的字体渲染,它们看起来像锯齿状的和糟糕的。在Adobe Reader中打开子像素渲染效果会更好。
speedplane 2014年

530

到此为止,这是快速,容易的,并且不需要任何第三方脚本:

<embed src="http://example.com/the.pdf" width="500" height="375" 
 type="application/pdf">

更新(1/2018):

Android上的Chrome浏览器不再支持PDF嵌入。您可以使用Google云端硬盘PDF查看器解决此问题

<embed src="https://drive.google.com/viewerng/
viewer?embedded=true&url=http://example.com/the.pdf" width="500" height="375">

30
最好使用<object>标记,以便可以包含一个后备。
乔纳森·希尔

1
我以为开发人员想知道Mac / Firefox的插件映像损坏了。插件页面不会加载正在寻找的插件。任何想法如何解决这个问题?
Shanimal 2012年

62
如果你想获得肯定它会显示,而不是自动下载PDF(因为它的发生给我)添加type='application/pdf'到嵌入标签
Hassek

31
最好使用<object>标记,因为它可以在无法显示pdf的浏览器中显示替代内容。如果需要,甚至可以将<embed>标签放入标签中<object>。参考:stackoverflow.com/questions/1244788/embed-vs-object
Raphael 2012年

1
@raphaelcm实际上,正如我之前说过的,仅在所有主要浏览器中使用embed标签即可。甚至IE 7&8
Batfan

360

您也可以为此使用Google PDF查看器。据我所知,这不是Google的正式功能(我对这个功能有误吗?),但它对我非常顺利。您需要先上传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。


29
应该提到的一件事是,可以显示的PDF大小有一个上限。我认为目前为10MB / 100页。PS:我不认为观众是“非官方的”。他们甚至还有一个使用指南页面,可以为您构建嵌入的URL:docs.google.com/viewer
SuperElectric 2011年

30
该选项很好用,但是您必须使您的PDF可以公开访问,但对我而言,这并非总是一个选项。
KoviNET 2012年

4
@riot_starter此解决方案不再起作用,如果您完全退出google,则可以正常加载;如果您完全登录,则可以正常加载,但是,如果您介于两者之间(无论如何),它将要求您输入密码。如果是iframe,则不会加载。
dwenaus

5
你被允许之间设置任何谷歌文档的保密性publicsign-in requiredprivate。考虑到Google Docs上的任何文档都可以embed选择,这绝对是一项官方功能。
b1nary.atr0phy 2013年

6
应该提到的另一件事是“您最近发出了太多请求”警告,这是一个限制。
kommradHomer 2013年

115

您可以通过在查询字符串中传递一些选项来控制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>

6
那是最好的解决方案,因为它使用的是浏览器功能,而不是复杂的第三方解决方案。在所有现代浏览器(IE9,FF或Chrome)中,PDF应该很好地嵌入。抱歉,IE 6/7用户。他们必须升级。很久以前,我们已经停止支持这些浏览器。:(
Adrian P.

2
不能在我的移动平板电脑版本的Chrome上运行。
Rocco The Taco

1
+1用于解决缩放和滚动选项,但是,这在最新的Chrome版本(44)中不起作用...无法加载PDF文档。
2015年

可以添加关闭按钮吗?如何?
罗伯托·塞普尔韦达·布拉沃

@RoccoTheTaco Seconded,不适用于Android上的移动浏览器
匿名

65

同时使用<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>

4
如果未安装pdf插件或版本过旧,则无法在浏览器中使用
Umair Hamid 2014年

同样,这将不会对那些与代码验证有关的人进行验证。
2015年

1
这对我来说非常有效,而Chrome和Firefox embed认为单独使用该标签是可行unsafe的。
Richie Thomas

1
由于某些原因,在Android(chrome)上,它没有嵌入PDF,而是提供下载它。在iPhone(Safari)上,它仅显示PDF的第一页。
伊万·鲁宾逊

21

通过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)可以像这样工作,但它有自己的特殊要求。


或者使用应用程序将图像转换为PNG,例如在Mac上预览。
加勒特2012年

2
但是您可以通过编程方式做到这一点吗?
丹·曼蒂拉

如果文档超过一页,该怎么办?我想您只会显示第一页,然后
2014年

@seb已经有一段时间了,但是我能够在2或3页长的PDF上使用它。扩展到更大的尺寸是不明智的,我认为移动浏览器很难显示这样的图像。这就是为什么我称其为“快速而肮脏的”方法,但是我认为这是一个很好的方法,只要PDF不超过几页即可。
Dan Mantyla

1
如果使用Zend库打开PDF那么你可以做一个foreach($pdf->pages as $page),并为每一页的图像
99个问题-语法不是一个

18

看看这段代码-将PDF嵌入HTML

<!-- Embed PDF File -->
<object data="YourFile.pdf" type="application/x-pdf" title="SamplePdf" width="500" height="720">
    <a href="YourFile.pdf">shree</a> 
</object>

6
这似乎不起作用。我总是以空白的灰色屏幕而不是pdf结尾。但是像@Gayle的回答中那样切换srcdata确实可以。
2011年

1
我正在使用Chrome 44,它将无法正常工作。我还尝试将数据切换到src。
2015年

type =“ application / pdf”解决了该问题。在chrome中可以正常工作。
加文·辛普森

13

FDViewPDF2SWF(其本身基于xpdf)与SWF查看器结合在一起,因此您可以在服务器上即时转换和嵌入PDF文档。

xpdf不是一个完美的PDF转换器。如果需要更好的结果,则Ghostview可以将PDF文档转换为其他格式,从而可以更轻松地为其构建Flash查看器。

但是对于简单的PDF文档,FDView应该可以正常工作。


FDView是否在其他任何地方可用?code4net.com似乎已经消失了。
迈克尔·迈尔斯

@Michael不是我很容易找到。如果有人在其他地方重新托管fdview,我将保留这个答案。
亚当·戴维斯

12

我们的问题是,由于法律原因,我们不允许将PDF临时存储在硬盘上。此外,在浏览器中将PDF显示为“预览”时,不应重新加载整个页面。

首先,我们尝试了PDF.jS。它与Firefox和Chrome浏览器中的Base64一起使用。但是,对于我们的PDF来说,它的速度慢得令人无法接受。IE / Edge根本不起作用。

因此,我们在HTML对象标记中使用Base64字符串进行了尝试。再次对于IE / Edge不起作用(可能与PDF.js相同)。在Chrome / Firefox / Safari中再次没有问题。这就是为什么我们选择混合解决方案。IE / Edge我们使用IFrame,所有其他浏览器都使用object-tag。

IFrame解决方案当然也适用于Chrome和合作伙伴。我们之所以未在Chrome上使用此解决方案,是因为尽管PDF可以正确显示,但是只要在预览中单击“下载”Chrome就会向服务器发出新请求。所需的隐藏字段pdfHelperTransferData因为PDF显示在IFrame中,所以不再设置(用于发送生成PDF所需的表单数据)。有关此功能/错误,请参见Chrome在下载PDF时发送两个请求(并取消其中一个)

现在问题IE9和IE10仍然存在。对于这些,我们放弃了预览解决方案,只需单击预览按钮将文档发送给用户即可下载文档(而不是预览)。我们已经做了很多尝试,但是即使我们找到了解决方案,为这小部分用户付出额外的努力也不值得。您可以在此处找到用于下载的解决方案:使用IFrame下载PDF而不进行刷新

我们的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的浏览器类型,请参见此处:如何使用JavaScript检测Internet Explorer(IE)和Microsoft Edge?我希望这些发现可以节省其他人的时间。


抱歉,但我不明白,变量“ transferData”具有什么样的价值?
凯特

1
@Kate,您好:在我们的案例中,我们根据用户在Web表单中的输入生成PDF。“ transferData”包含作为JSON发送到Web API中的PDF生成功能的数据。我添加了更多代码来澄清。
乔治·马哈里斯

10
  1. 创建一个容器来保存您的PDF

    <div id="example1"></div>
  2. 告诉PDFObject嵌入哪个PDF,以及在哪里嵌入

    <script src="/js/pdfobject.js"></script>
    <script>PDFObject.embed("/pdf/sample-3pp.pdf", "#example1");</script>
  3. 您可以选择使用CSS来指定视觉样式,包括尺寸,边框,边距等。

    <style>
    .pdfobject-container { height: 500px;}
    .pdfobject { border: 1px solid #666; }
    </style>

来源:https : //pdfobject.com/


这是一个非常好的解决方案,并且与自举样式配合使用时效果很好。所有这些都在其他引导元素之上。
netfed

您是否尝试了Blob文件?我pdf.output('bloburl')从lib jspdf中使用了它,但似乎不适用于IE11。
Hoang Tran Son

9

您可以像这样使用保存的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>


8

Scribd不再要求您将文档托管在其服务器上。如果您使用他们创建一个帐户,那么您将获得一个发布者ID。只需几行JavaScript代码即可加载存储在您自己的服务器上的PDF文件。

有关更多详细信息,请参见开发人员工具


1
您能否发布另一个链接来显示此操作的完成方式?您发布的链接不清楚。
SuperElectric 2011年

好像他们已更新其网站并更改了此页面。我认为此页面具有我在原始帖子中所指的内容:scribd.com/developers/api?method_name=Javascript+API
Bjorn

我希望我可以不止一次喜欢它,并且效果很好。滚动到该网站的底部,然后单击API以查看示例。
Rocco The Taco

1
现在已关闭签收注册。
Lance Fisher

4
<object width="400" height="400" data="helloworld.pdf"></object>

4

PdfToImageServlet使用ImageMagick的convert命令。

用法示例: <img src='/webAppDirectory/PdfToImageServlet?pdfFile=/usr/share/cups/data/default-testpage.pdf'>


4

这是我使用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>

3

您应该考虑的一种选择是“ 值得注意的PDF”,
它有一个免费计划,除非您打算在pdf上进行实时在线协作。

将以下内容嵌入iframe任何html并享受结果:

<iframe width='1000' height='800' src='http://bit.ly/1JxrtjR' frameborder='0' allowfullscreen></iframe>

2

要将文件流式传输到浏览器,请参见堆栈溢出问题。如何使用.NET 2.0将PDF文件作为二进制流式传输到浏览器。 -请注意,如果您要从文件系统提供文件,则应进行一些细微的改动,这应该可行。或动态生成。

如此说来,所引用的MSDN文章对世界的看法非常简单,因此您可能需要阅读通过HTTPS将PDF成功流式传输到浏览器以及可能需要提供的某些标头。

使用这种方法,iframe可能是最好的选择。拥有一个可流式处理文件的Web表单,然后将iframe置于src属性设置为第一个表单的另一页上。


4
@downvoter会在乎解释为什么您要匿名拒绝10岁的答案?
GalacticCowboy

1
  1. 构造输入PDF字节的Blob
  2. 使用此跨浏览器解决方法修补的iframePDF.js

iframe的URI应该如下所示:

/viewer.html?file=blob:19B579EA-5217-41C6-96E4-5D8DF5A5C70B

现在,FF,Chrome,IE 11和Edge都通过URL中的标准Blob URI传递的iframe中的查看器中显示PDF。


0

如果您不想自己托管PDF.JS,可以尝试DocDroid。它类似于Google云端硬盘PDF查看器,但允许自定义品牌。


0

我必须使用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>

-7

我发现这很好用,浏览器可以在Firefox中处理它。我尚未检查IE ...

<script>window.location='url'</script>

这应该达到什么目的?我看不到它如何回答这个问题。
TRiG

当我将PDF嵌入HTML时,我发现最好的方法是链接到该文档。例如<a href=" server1.network/trifold_JonesChiro.pdf“target='_blank'> Client Portal Trifold(示例)</a>),有时候打开页面并显示pdf而不是将其放置是一个很不错的答案在html中。它还允许pdf在选项卡中保持打开状态。
永利

因此,您的建议是链接而不是嵌入?很好,但是作为答案,目前还不清楚。
TRiG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.