phi*_*han 7 html javascript pdf html5 angularjs
我正在从我的服务器将一个Base64编码的pdf作为字符串加载到我的Javascript中.我的客户端应用程序使用的是AngularJS,HTML5.
我的HTML看起来像这样:
<div id="printablePdfContainer">
<iframe id="printablePdf" width="100%" height="100%"></iframe>
</div>
Run Code Online (Sandbox Code Playgroud)
我的Javascript看起来像这样:
var pdfName = 'data:application/pdf;base64,' + data[0].PrintImage;
var embeddedPdf = document.getElementById('printablePdf');
embeddedPdf.setAttribute('src', pdfName);
$scope.printDocument(embeddedPdf);
Run Code Online (Sandbox Code Playgroud)
我的printDocument功能如下所示:
$scope.printDocument = function() {
var test = document.getElementById('printablePdf');
if (typeof document.getElementById('printablePdf').print === 'undefined') {
setTimeout(function(){$scope.printDocument();}, 1000);
} else {
var x = document.getElementById('printablePdf');
x.print();
}
};
Run Code Online (Sandbox Code Playgroud)
printDocument函数取自堆栈溢出中的预先存在的问题(静默打印嵌入式PDF),这是打印嵌入式pdf的答案.但是,这似乎不再起作用了.我总是得到'未定义'
typeof document.getElementById('printablePdf').print === 'undefined'
Run Code Online (Sandbox Code Playgroud)
校验.似乎.print不存在或什么的.
所以,我的问题是:如何使用Javascript在HTML5中打印嵌入式PDF,而无需打开弹出窗口?
问候,菲尔
phi*_*han 15
这里也回答:从javascript嵌入标签打印Pdf
在经过大量研究之后,我将发布我在这里学到的东西.
PDF的显示方式因浏览器,浏览器版本,浏览器配置和操作系统而异.有很多变量,所以我将在这里讨论最常见的情况.
在所有浏览器上,我无法通过Javascript调用任何类型的print()方法,我只能使用PdfActions.OPENACTION会打印出来.我使用iText将这些嵌入到PDF中.
Chrome使用Adobe的查看器,该查看器不允许访问任何类型的print()方法,但会执行PDF中嵌入的PdfActions.因此,您可以在PDF中嵌入"OpenAction",并在从查看这些操作的任何应用程序打开时打印PDF调用.
Firefox(在特定版本之上,尽管所有最新版本)都使用Windows中的Adobe查看器,它也识别PdfActions.但是,在OSX中,它失去了对Adobe查看器的支持,并切换到Firefox查看器中的烘焙(pdf.js).哪个不支持PdfActions.
IE:我对IE没有太多考试.主要是因为在Firefox无法在OSX上运行之后,我放弃了从Javascript打印PDF(对我来说是一个要求).
我的PDF是由我控制的服务器生成的,因此我最终在服务器中进行了服务更改,并添加了一个获取PNG服务,该服务基于PDF生成使用的相同标记生成PNG.浏览器处理图像比我知道的PDF更好,但希望我能够重复使用PDF生成服务,因为它在我的代码中的其他地方使用.
它没有回答这个问题,但它是我所拥有的所有信息.我建议任何可能在将来发现这一点的人:如果可能的话,在这种情况下放弃PDF并简化.否则,如果您知道如何在OSX中的FF预览pdf查看器中通过Javascript调用print(),请更新此问题.
-Phil