在Firefox中打印PDF

如何在Firefox中打印PDF?

此function适用于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" 

Firefox:权限被拒绝访问属性“打印”

这是一个Firefox的错误 。 在本地,可以通过转到about:config将其禁用,并将pdfjs.disabled的属性设置为true。 只有可能的解决方法是使用服务器端脚本并修改pdf。 使用PHP你可以使用fpdf和embedded扩展来实现js(包括print()函数),或者简单地将pdf转换为图像,返回url并打印出来。 您可以使用FPDI来修改现有的PDF。 我会给你一个关于如何使用PHP的例子。

使用FPDI和PDF_JS生成内嵌JavaScript( 自动 打印 )的PDF文件

 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'); 

Chrome浏览器:安全错误(跨网站)

pdf应该位于同一个主机上。 Firefox在我的testing中可以和其他域一起使用,但是chrome给了我一个跨域错误。


Firefox:打印页面包括about:blank只有about:blank

您将在firefox( jsfiddle )中获得一个空白页面,因为它将在加载任何内容之前打印iframe。 像$(document).onload()提到的方法不会帮助,因为他们只等待DOM加载和setTimeout()仍然可能导致错误,因为你不知道要花费多长时间加载iFrame。

你可以简单地通过使用jQuery的load()来解决这个问题。 ( doc )这将使您可以使用callback函数作为参数。

如果提供了“完整”callback,则在执行后处理和HTML插入后执行callback。 对于jQuery集合中的每个元素来说,这个callback会被触发一次,并且this元素依次被设置为每个DOM元素。

代码示例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(); }); } 

或者,您可以直接创build一个jQuery对象,并使用jQuery的on() ( doc )来附加任何事件处理程序。

代码示例2jsfiddle

 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(); }); } 

编辑,更新

尝试使用window.onload事件, document.createElement()onload事件, setTimeout() ,其duration设置为2000 ,在将元素附加到document后设置iframe src

 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"); } 

plnkr http://plnkr.co/edit/mHBNmc5mdM0YJRwRbYif?p=preview

PDFs有Javascript支持。 我需要在创buildPHP生成的PDF时具有自动打印function,并且能够使用FPDF来实现它:

http://www.fpdf.org/en/script/script36.php

@clarkk我会build议使用更强大的东西已经覆盖了很多人我的build议是使用http://pdfmake.org/#/

我在我的数据表中使用这个pdfmake,它的工作原理绝对完美。 请记住,如果从表中打印多于10000行的数据或者浏览器的内存不足

我有一段时间没有使用这个,但这是我曾经做的从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> 

您可以实现打印function,而无需创build新的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(); 

用javascript或jQuery打印pdf

在html中创build一个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/