在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 )来附加任何事件处理程序。
代码示例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(); }); }
编辑,更新
尝试使用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"); }
PDFs有Javascript支持。 我需要在创buildPHP生成的PDF时具有自动打印function,并且能够使用FPDF来实现它:
@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/