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");
}
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:
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();
Imprima un pdf con javascript o jquery
Crea un iframe en html:
<iframe id="pdf-iframe">
Luego cambie el src de ese iframe y al cargar, imprímalo:
$(''#pdf-iframe'').attr("src", pdf_url).load(function(){
document.getElementById(''pdf-iframe'').contentWindow.print();
});
O bien, es posible que desee probar https://mozilla.github.io/pdf.js/