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

iFrame吗? 对象? 嵌入?

Adobe是怎么说的呢?

在我的例子中,PDF是动态生成的,因此不能在刷新之前将其上传到第三方解决方案。


当前回答

要将文件流式传输到浏览器,请参阅Stack Overflow问题如何使用。net 2.0将PDF文件流式传输为二进制文件到浏览器-请注意,有一些小的变化,无论您是从文件系统提供文件还是动态生成文件,这都可以工作。

尽管如此,所引用的MSDN文章对世界的看法相当简单,因此您可能希望阅读通过HTTPS成功地将PDF传输到浏览器以及您可能需要提供的一些标题。

使用这种方法,iframe可能是最好的方法。有一个流文件的webform,然后将iframe放在另一个页面上,并将其src属性设置为第一个表单。

其他回答

如果你不想自己托管PDF.JS,你可以试试DocDroid。它类似于谷歌Drive PDF查看器,但允许自定义品牌。

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

我发现这工作得很好,浏览器处理它在firefox。我没有检查IE…

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

我已经在其他地方回答了这个问题,但是,我在多个解之间做了一个求值。另外,如果你打算用于商业用途,这些可能会有所帮助:

免费的解决方案

iframe:只是使用一个iframe,然而,这不是大多数人在这里搜索的。 [谷歌Docs预览]谷歌Docs有预览(在这里查看其他答案) Pdf.js是没有外部依赖的开源解决方案 Adobe提供了一种“免费”的PDF嵌入API——如果你对基于云的解决方案满意,推荐使用这种方法。

商业服务提供商

Pdf.js Express是Pdf.js的商业化扩展(性能最差的产品,不贵) PSPDFKit -来自奥地利的供应商,提供良好的业务支持(价格适中,产品好) Foxit -中国公司提供PDF网页solton以及。(最便宜的商业报价) PDFTron -美国PSDPDFkit的竞争对手(更昂贵,但也更先进)

希望这能有所帮助。我可能会在博客中发布更详细的信息,如果这对人们有帮助的话(请在评论中告诉我)。

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

首先我们尝试了PDF.jS。它与Firefox和Chrome浏览器中的Base64一起工作。然而,对于我们的PDF来说,它慢得令人无法接受。IE/Edge完全不能工作。

因此,我们尝试在HTML对象标记中使用Base64字符串。这同样不适用于IE/Edge(可能与PDF.js的问题相同)。在Chrome/Firefox/Safari中也没有问题。 这就是我们选择混合解决方案的原因。边缘,我们使用IFrame和所有其他浏览器的对象标签。 IFrame解决方案当然也适用于Chrome和其他浏览器。我们没有在Chrome上使用这个解决方案的原因是,尽管PDF显示正确,但当你在预览中点击“下载”时,Chrome会立即向服务器发出新的请求。所需的隐藏字段pdfHelperTransferData(用于发送PDF生成所需的表单数据)不再设置,因为PDF显示在IFrame中。关于此功能/错误,请参阅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 ?我希望这些发现能为其他人节省时间。