如何在Firefox中打印PDF?
此功能适用于Chrome,但不适用于Firefox
function print_pdf(url){
var id = 'iframe', html = '<iframe id="'+id+'" src="'+url+'" style="display:none"></iframe>';
$('#main').append(html);
$('#'+id).load(function(){
document.getElementById(id).contentWindow.print();
}
}
Error: Permission denied to access property "print"
答案 0 :(得分:31)
这是bug in firefox。在本地,可以通过转到about:config
并将pdfjs.disabled
的属性设置为true来禁用它。唯一可行的解决方法是使用服务器端脚本并修改pdf。使用php,你可以使用fpdf并嵌入extensions来实现js(包括print()
函数)或者只是将pdf转换为图像,返回url并打印它。您可以使用FPDI修改现有的pdf。我将举例说明如何使用PHP。
require_once('fpdf.php');
require_once('fpdi.php');
class PDF_JavaScript extends FPDI {
var $javascript;
var $n_js;
function IncludeJS($script) {
$this->javascript=$script;
}
function _putjavascript() {
$this->_newobj();
$this->n_js=$this->n;
$this->_out('<<');
$this->_out('/Names [(EmbeddedJS) '.($this->n+1).' 0 R]');
$this->_out('>>');
$this->_out('endobj');
$this->_newobj();
$this->_out('<<');
$this->_out('/S /JavaScript');
$this->_out('/JS '.$this->_textstring($this->javascript));
$this->_out('>>');
$this->_out('endobj');
}
function _putresources() {
parent::_putresources();
if (!empty($this->javascript)) {
$this->_putjavascript();
}
}
function _putcatalog() {
parent::_putcatalog();
if (!empty($this->javascript)) {
$this->_out('/Names <</JavaScript '.($this->n_js).' 0 R>>');
}
}
}
class PDF_AutoPrint extends PDF_JavaScript
{
function AutoPrint($dialog=false)
{
//Open the print dialog or start printing immediately on the standard printer
$param=($dialog ? 'true' : 'false');
$script="print($param);";
$this->IncludeJS($script);
}
function AutoPrintToPrinter($server, $printer, $dialog=false)
{
$script = "document.contentWindow.print();";
$this->IncludeJS($script);
}
}
$pdf=new PDF_AutoPrint();
$pdf->setSourceFile("mozilla.pdf");
//Open the print dialog
$tplIdx = $pdf->importPage(1, '/MediaBox');
$pdf->addPage();
$pdf->useTemplate($tplIdx, 10, 10, 90);
$pdf->AutoPrint(true);
$pdf->Output('generated.pdf', 'F');
现在您只需将生成的pdf附加到您的页面,所包含的javascript就会调用print()
函数。您甚至不必再手动调用它。但是,在Firefox中,这只适用于visibility: hidden
,而不适用于display: none
。
function print_pdf(url){
var iFrameJQueryObject = $('<iframe id="iframe" src="'+url+'" style="visibility: hidden"></iframe>');
$('#foo').append(iFrameJQueryObject);
}
print_pdf('mozilla_generated.pdf');
pdf应位于同一主机上。在我的测试中,Firefox对其他域名没问题,但chrome给了我跨域错误。
about:blank
您将在firefox(jsfiddle)中获得一个空白页面,因为它会在加载任何内容之前打印iframe。提及像$(document).onload()
这样的方法无法提供帮助,因为他们只等待加载DOM而setTimeout()
仍然可能导致错误,因为您不知道加载iFrame需要多长时间。
您可以使用jQuery&#39; load()
来解决此问题。 (doc)这将使您可以使用回调函数作为参数。
如果&#34;完成&#34;提供回调,在后处理和执行HTML插入后执行。对jQuery集合中的每个元素触发一次回调,并依次为每个DOM元素设置
this
。
代码示例1
function print_pdf(url){
var id = 'iframe', html = '<iframe id="'+id+'" src="'+url+'" style="display:none"></iframe>';
$('body').append(html);
// wait for the iFrame to fully load and call the print() function afterwards
$('#' + id).load(function () {
document.getElementById(id).contentWindow.print();
});
}
或者你可以直接创建一个jQuery对象并使用jQuery&#39; on()
(doc)来附加任何事件处理程序。
代码示例2 ( jsfiddle )
function print_pdf(url){
var iFrameJQueryObject = $('<iframe id="iframe" src="'+url+'" style="display:none"></iframe>');
$('body').append(iFrameJQueryObject);
iFrameJQueryObject.on('load', function(){
$(this).get(0).contentWindow.print();
});
}
答案 1 :(得分:4)
修改,更新
尝试使用window.onload
事件,document.createElement()
,onload
事件,setTimeout()
并将duration
设置为2000
,设置src
将元素追加到iframe
document
window.onload = function() {
function print_pdf(url){
var id = "iframe", frame = document.createElement("iframe");
frame.setAttribute("id", id);
frame.setAttribute("width", "800px");
frame.setAttribute("height", "600px");
frame.setAttribute("allowfullscreen", "true");
frame.setAttribute("name", "printframe");
document.body.appendChild(frame);
frame.onload = function() {
this.requestFullScreen = this.mozRequestFullScreen
|| this.webkitRequestFullScreen;
this.requestFullScreen();
setTimeout(function() {
print()
},2000)
}
frame.setAttribute("src", url);
}
print_pdf("http://zeitreisen.zeit.de/wp-content/uploads/2014/09/pdftest2.pdf");
}
答案 2 :(得分:2)
PDF有Javascript支持。创建PHP生成的PDF并且我能够使用FPDF使其工作时,我需要具有自动打印功能:
答案 3 :(得分:0)
@clarkk我建议使用更强大的功能,我的建议是使用http://pdfmake.org/#/。
我在我的数据表中使用了这个pdfmake,它的工作非常完美。请记住,如果您从表中打印超过10 000行,或者它会耗尽浏览器的内存:)
答案 4 :(得分:0)
我暂时没有使用它,但这是我以前从iframe打印pdf的原因......
function printfile() {
window.frames['objAdobePrint'].focus();
window.frames['objAdobePrint'].print();
}
<iframe src="urlOfPdf" name="objAdobePrint" id="objAdobePrint"></iframe>
<button onclick="printfile();">Print</button>
答案 5 :(得分:0)
您可以在不创建新iframe(仅限css)的情况下实现打印功能,以防止出现安全问题:
var style = document.createElement("style");
style.setAttribute("media", "print"); //style.setAttribute("media", "screen,print");
style.appendChild(document.createTextNode(""));
document.head.appendChild(style);
var width = $("#printDiv").width();
var height = $("#printDiv").height();
style.sheet.insertRule("body { width: 210mm !important, height: 25.4mm !important; visibility: hidden; }", 0);
style.sheet.insertRule("#printDiv { visibility: visible; position: fixed !important;top: 5px; left: 5px; width:" + width + "px;height:" + height + "; page-break-after: avoid;}", 0);
window.focus();
window.print(true);
style.remove();
答案 6 :(得分:-1)
Print a pdf with javascript or jquery
在html中创建iframe:
<iframe id="pdf-iframe">
然后更改该iframe的src并在加载时打印它:
$('#pdf-iframe').attr("src", pdf_url).load(function(){
document.getElementById('pdf-iframe').contentWindow.print();
});
或者,您可能想尝试https://mozilla.github.io/pdf.js/