visualizar visor plugin para descargar activar javascript jquery firefox printing pdf-generation

javascript - visor - Imprimir PDF en Firefox



visualizar pdf en firefox (7)

Cómo imprimir un PDF en Firefox?

Esta función funciona en Chrome pero no en 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

Error: Permission denied to access property "print"


Firefox: Permiso denegado para acceder a la propiedad "imprimir"

Este es un error en Firefox . Localmente se puede desactivar yendo a about:config y establecer la propiedad de pdfjs.disabled en true. La única solución posible es usar un script del lado del servidor y modificar el pdf. Usando php, puede usar las fpdf e incrustar para implementar js (inclunding the print() function) o simplemente convertir el pdf a una imagen, devolver la url e imprimirla. Podría usar FPDI para modificar el pdf existente. Le daré un ejemplo sobre cómo lo hice para trabajar con PHP.

Generación de un archivo PDF con javascript en línea (autoprint) usando FPDI y extensions

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

Ahora puede simplemente agregar el pdf generado a su página y el javascript incluido llamará a la función print() . Ni siquiera tiene que llamarlo manualmente nunca más. Sin embargo, en firefox esto solo funcionará con visibility: hidden y no con 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: Error de seguridad (origen cruzado)

El pdf debe estar ubicado en el mismo host. Firefox estaba bien con otros dominios en mis pruebas, pero Chrome me dio errores de origen cruzado.

Firefox: la página impresa incluye about:blank solo en about:blank

Obtendrá una página vacía en firefox ( jsfiddle ), ya que imprimirá el iframe antes de que haya cargado cualquier contenido. Los métodos mencionados como $(document).onload() no serán de ayuda, ya que solo esperan a que DOM se cargue y setTimeout() aún puede setTimeout() errores, ya que no se sabe cuánto tarda el iFrame en cargarse.

Simplemente puede resolver este problema usando load() jQuery. ( doc ) Esto le dará la posibilidad de usar una función de devolución de llamada como parámetro.

si se proporciona una devolución de llamada "completa", se ejecuta después del postproceso y se ha realizado la inserción de HTML. La devolución de llamada se activa una vez para cada elemento en la colección jQuery, y this se establece para cada elemento DOM a su vez.

Ejemplo de código 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(); }); }

Alternativamente, puede crear directamente un objeto jQuery y usar jQuery''s on() ( doc ) para adjuntar cualquier controlador de eventos.

Ejemplo de código 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(); }); }


@clarkk recomendaría usar algo más poderoso que haya sido cubierto por muchas personas, mi sugerencia es usar http://pdfmake.org/#/ .

He usado este pdfmake en mis tablas de datos y funciona absolutamente perfecto. Tenga en cuenta que si imprime más de 10 000 filas de tablas o algo se agota la memoria del navegador :)


Editar, actualizado

Intente usar window.onload event, document.createElement() , onload event, setTimeout() con duration establecida en 2000 , configurando src of iframe después de agregar el elemento al 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"); }

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


Los archivos PDF tienen soporte Javascript. Necesitaba tener capacidades de impresión automática cuando se creó un PDF generado por PHP y pude usar FPDF para que funcione:

extensions


No he usado esto por un tiempo, pero esto es lo que solía hacer para imprimir pdf desde un iframe ...

function printfile() { window.frames[''objAdobePrint''].focus(); window.frames[''objAdobePrint''].print(); } <iframe src="urlOfPdf" name="objAdobePrint" id="objAdobePrint"></iframe> <button onclick="printfile();">Print</button>


Puede implementar la función de impresión sin crear un nuevo iframe (solo con css) para evitar problemas de seguridad:

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