在HTML中嵌入PDF的建议方法是什么?
Adobe对此有何评论?
在我的例子中,PDF是动态生成的,因此在刷新它之前,它不能上载到第三方解决方案。
尝试pdf2htmlex github.com coolwanglu pdf2htmlex:/ /
有一个伟大的比较具体的解决方案,但不只是一般的策略,在pdf2htmlex回购的Wiki。所以,虽然我还没有试过它,这似乎是a保持叉。
最好的方法可能是使用pdf.js库。它是一个纯粹的HTML5/javascript渲染器,用于PDF文档,没有任何第三方插件。
在线演示:http://mozilla.github.com/pdf.js/web/viewer.html
github:https://github.com/mozilla/pdf.js
正如另一个答案所指出的,scribd实际上使用pdf2swf来转换pdf文件。
我强烈建议不要使用scribd——我刚刚在一个特定的文档上做了一个实验,在firefox 4中,它只显示前3页,而在ie9中,它的文本呈现错误——它偏移了页面的某些部分。所以从技术上讲,它是四轮马车。此外,他们希望您订阅打印或下载文档!从本质上说,他们拿走了以前免费的文件,并在文件周围竖起了一道收费墙。
JS库实际上看起来是一个很好的解决方案,尽管链接的演示没有显示它嵌入到一个页面中(它占据了整个页面)。但是它使用了hmtl5画布,所以应该很容易嵌入,而且速度很快。在底层,需要使用一些JS,而不像 :github.com/mozilla/pdf.js/blob/master/examples/helloworld/…
有了所有这些激进而完全不同的解决方案,我会说没有正确的答案。
pdf.js在Chrome等平板电脑浏览器上运行不佳。我还发现对于较大的PDF文档来说,速度非常非常慢。
使用pdf.js和使用pdf.js的最终结果有什么区别?
我不敢相信这是被推荐的。看看在线演示中的字体渲染,它们看起来参差不齐,很糟糕。在AdobeReader中打开时,使用亚像素渲染效果会更好。
PDF.js v1.0.58 (build: ee545dd) Message: Unexpected server response (204) while retrieving PDF"http://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf". 开始下载pdf文件。
我已经测试过pdf.js,只有令人愉快的惊喜,@[Rocco the Tacco]对于大型PDF,您可以逐页加载它,对于移动浏览器,我认为建议使用兼容性组件;目前唯一的缩减是与IE8等旧浏览器的兼容性,我的唯一解决方案是显示对象和嵌入。
pdf.js似乎不是一个真正好的解决方案。水印等有很多问题,有些PDF甚至在IE上根本不显示。
即使在你的演示中,我的IDM(Internet下载管理器)也会为我抓取一个下载链接,不要让你的文件在浏览器中打开。
@StevenBennett为我做这件事的特点是我完全控制文档周围的Chrome——我可以选择以适合我的站点的样式显示上一个/下一个按钮、缩放按钮等,或者选择根本不显示它们,而不是使用每个浏览器的标准浏览器Chrome。
PDFJS在HTML5中转换您的PDF;这会破坏大多数潜在的浏览器不兼容性,但与嵌入替代方案相比,PDFJS尤其不是即时的和易于使用的。我不会推荐它,除非您有足够的时间来学习和正确配置它。
@decebal如何逐页加载?据我所知,pdfjs.getdocument(url)将下载完整的pdf,然后只会逐页呈现。是否可以下载单个页面,然后在下载时立即显示?因为我不想等待它完全下载
当您记住需要在Web服务器上测试它(file://protocol不起作用)之后,pdf.js就可以很好地工作了。
我将使用pdf.js和tcpdf条形码在pdf中创建一个qrcode,并在网站上显示为图像。它比之前使用的google qrcode generator要快得多,因为它需要将近一分钟的时间来生成。
这个库的缺点是它是一个图像,不能复制文本
这是一个快速、简单的要点,不需要任何第三方脚本:
1 2
<embed src="http://example.com/the.pdf" width="500" height="375"
type="application/pdf">
更新(1/2018):
Android上的Chrome浏览器不再支持PDF嵌入。您可以通过使用Google Drive PDF查看器来绕过这个问题。
1 2
<embed src="https://drive.google.com/viewerng/
viewer?embedded=true&url=http://example.com/the.pdf" width="500" height="375">
更好地使用在<对象>标签,这样你可以include a的情况反馈。
嗯,什么?它在FF,Chrome和IE 7 / 8 / 9。
我认为开发者会想知道Mac Firefox插件会破碎的形象。在插件的页面不会加载它的插件。任何想法如何回头本?
"shanimal -这似乎是一个问题——blog.mozilla.org Adobe插件/ 2012/05/04/Adobe阅读器-封闭- MAC
@Shanimal-我没有Mac可以测试它,但这可能有助于您--addons.mozilla.org/en-us/firefox/addon/&hellip;
如果你想确定它会被显示,而不是自动下载PDF(就像我看到的那样),那么就把type='application/pdf' 添加到嵌入标签中。
最好使用 标记,因为它可以在无法显示PDF的浏览器中显示替代内容。如果您需要,甚至可以将 标记放在 标记中。参考:stackoverflow.com/questions/1244788/embed-vs-object
@正如我之前所说,Raphaelcm实际上只在所有主要浏览器中使用嵌入标记。即使是IE 7和8。
@Batfan:是的,但是如果你想支持,比如说,IE 6或其他古老的浏览器,那么 支持显示替代内容的事实似乎给了它优势。因为它也适用于所有的现代浏览器。
@拉斐尔姆同意了。尽管如此,大多数开发商已经放弃了对IE6的支持,因为它在美国的市场份额低于1%(全球5%)。
我的Acrobat"在浏览器中查看文档"未启用,因此当我使用此插件时,它会将嵌入内容保留为空白区域,并在Acrobat中打开PDF。我正试图在浏览器中强制预览文档,因此此选项不起作用。
@johnathanelmore只是出于好奇,为什么"在浏览器中查看文档"被禁用?我想绝大多数用户都启用了这个功能。无论如何,如果它不是一个选项,您可能希望使用另一个PDF查看器。google docs viewer可能会工作-docs.google.com/viewer
是的,我们选择了谷歌文档浏览器。这是我们的工作PC,我想这是整个组织的默认设置。
它需要Adobe Reader插件来查看PDF。
@不幸的是,google docs加上firefox有一个已知的问题,即当页面最初加载时,强制页面跳转到框架。如果框架位于页面底部,这可能是一个主要问题。
有什么方法可以设置初始缩放比例吗?
@我不这么认为。不管怎样都不能嵌入。你必须使用对象标签。
你需要一个插件与IE一起使用,但是Chrome内置了支持。不了解其他浏览器。使用对象标记时,我在IE(使用Adobe Reader)中弹出了"拒绝访问"错误消息,因此改为使用嵌入标记。但是,当Angular动态更新src属性时,AM使用Angular并在chrome中出现问题-解决方案是创建一个指令,该指令会破坏整个元素,并在每次URL更改时使用新的src重新创建一个新的元素。
现在如何打印该对象?
@miguel-在两个firefox&chrome中,将光标悬停在PDF上时,会出现一个打印图标。在Microsoft Edge中似乎不是这样。在这种情况下,您可能需要先保存文档(右键单击"另存为"),然后再打印。
@是的,但是我想自动打印…这是一个发票软件
@米格尔-stackoverflow.com/questions/16239513/&hellip;
但这绝对是最好的答案。它在Chrome中非常适合我,没有人想使用更多的第三方插件。保持简单!
最好的方法是,我们可以在所有浏览器jsgyan.blogspot.in/2017/12/&hellip中显示pdf;
似乎不适用于移动Chrome
@匿名,我已经更新了我的答案。
当您以这种方式将PDF嵌入浏览器时,是否有一种方法可以使用平移而不是选择文本?
在Chrome桌面上为我显示空白空白。
@Lauranms你能提供一个链接,显示这个吗?
@巴蒂凡:不,对不起。我最后在我的项目中使用了JPG。
当这样做的时候,有没有一种方法来获取用户所在的页码,以及一种方法来获取onscroll事件?
@如果需要的话,使用pdf.js可能会更好。您可以获得当前页码->stackoverflow.com/a/43336021/163906
那么如何从嵌入的PDF中获得突出显示的文本呢?
为此,您也可以使用Google PDF查看器。据我所知,这不是谷歌的官方功能(我错了吗?)但它对我来说非常好和顺利。你需要上传你的PDF文件,然后使用它的网址:
1
<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。
一提到的东西应该是它的上极限尺寸的PDF可以被显示。我认为它有10MB/100页。PS:I don’t认为浏览器是"非官方的";他们甚至有一个如何构建嵌入式URL的一页:docs.google.com /查看器。
本选项的伟大工程,但你必须让你的PDF文件的公开访问的,这对我来说是不总是选择。
"ronsmith,它不再需要登录。
解决方案:这_防暴起动器不再工作,如果你是做IT负载完全离开谷歌,如果你做的好,完全是在它位于精细,但是如果你是在之间的信息(无论是均值)问你的密码。在案例的iframe,它只是不负载。
你的隐私设置允许任何之间的public Google Docs,sign-in required 和private 。它肯定是在考虑任何正式的特征,有embed 在Google Docs文档选项。
另一个提到的东西应该是"你有太多的要求和制造"的警告,这是限制。
"你有一个kommradhomer显示那个速度极限?
"I don’t检测NO。和知道,我没有真的尝试或使用本法。
是安静的工作吗?我用它在过去的成功。现在我得到的错误
这将工作在Firefox的只有我的智囊团。铬使iframe的IE spits"这个广告内容不能显示在一帧"
应该注意,如果你想有它的PDF图像图像而不降级。
谷歌浏览器是好的,但它的优势是斜面的PDF文件(例如当你没有互联网连接。优选的是,当你是pdf.js观看PDF从您的服务器。
你能使用这方法来显示PDF文件的完整路径没有把网站?你可以只使用直接的路径?例子:docs.google.com / gview?URL路径/ mypdf.pdf =
不工作:从中国
最佳的方式可以发现在2017年12 jsgyan.blogspot.in / / / & hellip;
它只是说"不可预见"。
这不与https://docs.goo... 由于CORS。什么是更多,如果你的网站托管在SSL连接上这个embed 不负载,因为它在insecure资源。
通过在查询字符串中传递一些选项,您确实可以控制PDF在浏览器中的显示方式。我很高兴这项工作,直到我意识到它在IE8中不起作用。:(
它可以在Chrome9和火狐3.6中使用,但在IE8中会显示消息"如果无法显示PDF,请在此处插入错误消息"。
不过,我还没有测试上述任何浏览器的旧版本。但这是我的代码,以防它对任何人都有帮助。这将缩放设置为85%,删除滚动条、工具栏和导航窗格。我会更新我的帖子,如果我遇到一些在IE中也有效的东西。
1 2 3 4 5
<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>
这是最好的解决方案,因为是使用浏览器的功能和复杂的第三方解决方案的人。在所有的现代浏览器(或浏览器IE9,FF)嵌入PDF应该不错。对不起,IE 6 / 7的用户。他们升级。我们已经停止支持的浏览器长时间前提出。:(
不工作对我..fyi ...pity铬版移动平板,将是一个快速修复。
1缩放和滚动选项的解决,但是,这不是工作在最新的浏览器版本(44)。无法加载的PDF文件。
它可以添加a close按钮?和如何?
"roccothetaco seconded不工作,在Android手机浏览器
对象的一天不工作,我的桌面上的PDF浏览器。
同时使用 和 将为您提供更广泛的浏览器兼容性。
1 2 3 4 5 6 7
<object data="http://yoursite.com/the.pdf" type="application/pdf" width="750px" height="750px">
<p>
This browser does not support PDFs. Please download the PDF to view it: Download PDF.
</p>
</embed>
</object>
如果PDF加载项未安装或已过期,则在浏览器中不起作用。
此外,这不会验证与代码验证有关的那些。
这对我来说很好,而使用embed 标签本身就被chrome和firefox视为unsafe 。
出于某种原因,Android(Chrome)没有嵌入PDF,而是提供下载。在iPhone(Safari)上,它只显示PDF的第一页。
通过ImageMagick将其转换为PNG,并显示PNG(快速和脏)。
1 2 3 4 5 6
<?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)可以这样工作,但它有自己的特殊要求。
或者使用应用程序(如在Mac上预览)将图像转换为PNG。
但是你能用程序实现吗?
如果文档超过一页怎么办?我想你那时只会显示第一页
@SEB已经有一段时间了,但我可以在2或3页长的PDF上使用它。我认为移动浏览器很难显示像这样的图像,这样做是不明智的。这就是为什么我称之为"快速和肮脏"的方法,但这是一个很好的方法,我认为只要PDF不超过几页。
如果使用Zend库打开PDF,则可以执行foreach($pdf->pages as $page) ,并为每个页面创建一个图像。
查看此代码-将PDF嵌入HTML
1 2 3 4
<!-- Embed PDF File -->
<object data="YourFile.pdf" type="application/x-pdf" title="SamplePdf" width="500" height="720">
shree
</object>
这似乎不起作用。我总是以一个空白的灰色屏幕而不是PDF结尾。但是,像在@gayle的回答中那样,将src 换成data 确实有效。
我用的是Chrome44,但它不起作用。我还尝试将数据切换到SRC。
对象是HTML 5,是否使用正确的doctype?
type ="应用/ PDF"功能的问题。美术作品中的铬。
fdview将pdf2swf(它本身基于xpdf)与swf查看器结合在一起,这样您就可以在服务器上即时转换和嵌入PDF文档。
xpdf不是一个完美的pdf转换器。如果您需要更好的结果,那么GhostView具有将PDF文档转换为其他格式的能力,您可以更轻松地为其构建Flash查看器。
但是对于简单的PDF文档,fdView应该工作得相当好。
fdView是否在其他地方可用?code4net.com似乎消失了。
@迈克尔,我不容易找到。我将不考虑有人在其他地方重新托管FDVIEW。
我们的问题是,出于法律原因,我们不允许在硬盘上临时存储PDF。此外,在浏览器中将PDF显示为预览时,不应重新加载整个页面。
首先我们尝试了pdf.js。它与Firefox和Chrome浏览器中的base64一起工作。然而,对于我们的PDF来说,速度慢得让人无法接受。IE/EDGE根本不工作。
因此,我们尝试在HTML对象标记中使用base64字符串。这同样不适用于IE/EDGE(可能与pdf.js的问题相同)。在Chrome/FireFox/Safari中,没问题。这就是我们选择混合解决方案的原因。ie/edge使用iframe,对于所有其他浏览器,使用object标记。 BR/>iFrame解决方案当然也适用于Chrome和Co。我们之所以不将此解决方案用于Chrome,是因为尽管PDF显示正确,但只要您在预览中单击"下载",Chrome就会向服务器发出新的请求。所需的隐藏字段pdfhelperTransferData(用于发送生成PDF所需的表单数据)不再设置,因为PDF显示在iframe中。有关此功能/错误,请参阅chrome在下载PDF时发送两个请求(并取消其中一个请求)。
现在问题儿童IE9和IE10仍然存在。对于这些,我们放弃了一个预览解决方案,只需单击预览按钮将文档作为下载发送给用户(而不是预览)。我们已经尝试了很多,但是即使我们找到了一个解决方案,对于这一小部分用户来说额外的努力也不值得。您可以在这里找到我们的下载解决方案:下载PDF而不使用iframe刷新。
我们的JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
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
1 2 3 4 5 6 7 8
<form id="pdf-helper-form" method="post">
<input type="hidden" name="pdfHelperTransferData" id="pdfHelperTransferData" />
</form>
<iframe id="iframe-pdf-shower" name="iframe-pdf-shower"></iframe>
<object id="object-pdf-shower" type="application/pdf"></object>
要检查IE/EDGE的浏览器类型,请参见此处:如何使用javascript检测Internet Explorer(IE)和Microsoft Edge?我希望这些发现能节省别人的时间。
对不起,我不明白变量"transferData"有什么值?
嗨@kate,在我们的例子中,我们根据用户在Web表单中的输入生成PDF。"TransferData"包含以JSON形式发送到Web API中的PDF生成函数的数据。我增加了一行代码来澄清。
创建一个保存PDF的容器
告诉pdfObject要嵌入哪个pdf,以及在哪里嵌入它
1 2
<script src="/js/pdfobject.js">
PDFObject.embed("/pdf/sample-3pp.pdf","#example1");
您可以选择使用CSS指定视觉样式,包括尺寸、边框、边距等。
1 2 3 4
<style>
.pdfobject-container { height: 500px;}
.pdfobject { border: 1px solid #666; }
</style>
资料来源:https://pdfobject.com/
这是一个非常好的解决方案,与引导样式结合使用效果很好。这一切都是在其他引导元素之上进行的。
你试过BLOB文件吗?我在lib jsdf的pdf.output('bloburl') 中使用了这个,但它似乎不适用于ie11。
Scribd不再要求您在其服务器上托管文档。如果你用它们创建了一个帐户,这样你就可以得到一个发布者ID。只需几行javascript代码就可以加载存储在你自己服务器上的PDF文件。
有关详细信息,请参阅开发人员工具。
你能后的另一个链接,显示这是如何做的?它从你的链接张贴第一。
似乎他们更新了他们的网站和本页。我想本页内容是指有一个在我的原始帖子:Scribd.com赞助/开发商/ API吗?方法_ JavaScript API名称= +
我希望我可以这样超过一次,它的作品完美。靠近底部的滚动和点击网站的API的例子是湖。
signups Scribd现在是关闭的。
1
<object width="400" height="400" data="helloworld.pdf"></object>
pdftoimageservlet使用imagemagick的convert 命令。
使用实例:
您应该考虑的一个选项是值得注意的PDF它有一个免费的计划,除非你计划在PDF上进行实时在线协作。
在任何HTML中嵌入以下iframe 并享受结果:
1
<iframe width='1000' height='800' src='http://bit.ly/1JxrtjR' frameborder='0' allowfullscreen></iframe>
要将文件传输到浏览器,请参见堆栈溢出问题如何使用.NET 2.0将PDF文件作为二进制文件传输到浏览器-请注意,如果存在微小的变化,无论是从文件系统提供文件还是动态生成文件,都应该可以实现这一点。
尽管如此,所引用的msdn文章对世界的看法相当简单,因此您可能希望通过https成功地将pdf流式传输到浏览器,也可能需要提供一些头文件。
使用这种方法,iframe可能是最好的方法。让一个WebForm对文件进行流式处理,然后将iframe放在另一个页面上,并将其src 属性设置为第一个表单。
这就是我处理axios和vue.js的方法:
1 2 3 4 5 6 7 8 9 10 11 12
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:
1
<object width='100%' height='600px' :data='urlPdf' type='application/pdf'></object>
构造一个输入PDF字节的blob
使用此跨浏览器修补的iframe和pdf.js解决办法
iframe的URI应该如下所示:
1
/viewer.html?file=blob:19B579EA-5217-41C6-96E4-5D8DF5A5C70B
现在,FF、Chrome、IE 11和Edge都在通过URL中的标准blob uri传递的iframe中的查看器中显示PDF。
如果您不想单独托管pdf.js,可以尝试docdroid。它类似于Google Drive PDF查看器,但允许自定义品牌。
我发现这个很好用,浏览器在火狐中处理。我没有查过。
这应该实现什么?我看不出它是如何回答这个问题的。
当我在HTML中嵌入一个PDF时,我发现最好的方法是有一个指向此文档的链接。例如server1.network/trifoldu joneschiro.pdf"target='u blank'>客户端门户Trifold(示例),有时打开一个页面并显示PDF与tring以将其放入HTML是一个干净的答案。它还允许PDF在选项卡中保持打开状态。
所以你的建议是链接,而不是嵌入?没关系,但作为一个答案,这还不清楚。