Imprima PDF directamente desde JavaScript

Resuelto Craig Celeste asked hace 11 años • 11 respuestas

Estoy creando una lista de archivos PDF en HTML. En la lista me gustaría incluir un enlace de descarga y un botón/enlace de impresión. ¿Hay alguna forma de abrir directamente el cuadro de diálogo Imprimir para el PDF sin que el usuario vea el PDF o abra un visor de PDF?

¿Alguna variación de descargar el PDF en un iframe oculto y activarlo para imprimir con JavaScript?

Craig Celeste avatar Apr 26 '13 22:04 Craig Celeste
Aceptado

Según los comentarios a continuación, ya no funciona en los navegadores modernos.
Esta pregunta demuestra un enfoque que podría resultarle útil: Impresión silenciosa de un PDF incrustado.

Utiliza la <embed>etiqueta para incrustar el PDF en el documento:

<embed
    type="application/pdf"
    src="path_to_pdf_document.pdf"
    id="pdfDocument"
    width="100%"
    height="100%" />

Luego llamas al .print()método en el elemento en Javascript cuando se carga el PDF:

function printDocument(documentId) {
    var doc = document.getElementById(documentId);

    //Wait until PDF is ready to print    
    if (typeof doc.print === 'undefined') {    
        setTimeout(function(){printDocument(documentId);}, 1000);
    } else {
        doc.print();
    }
}

Puede colocar la inserción en un iframe oculto e imprimirla desde allí, lo que le brindará una experiencia perfecta.

nullability avatar Apr 26 '2013 15:04 nullability

Aquí hay una función para imprimir un PDF desde un iframe.

Sólo necesitas pasar la URL del PDF a la función. Creará un iframe y activará la impresión una vez que se cargue el PDF.

Tenga en cuenta que la función no destruye el iframe. En cambio, lo reutiliza cada vez que se llama a la función. Es difícil destruir el iframe porque es necesario hasta que finalice la impresión y el método de impresión no admite devolución de llamada (hasta donde yo sé).

printPdf = function (url) {
  var iframe = this._printIframe;
  if (!this._printIframe) {
    iframe = this._printIframe = document.createElement('iframe');
    document.body.appendChild(iframe);

    iframe.style.display = 'none';
    iframe.onload = function() {
      setTimeout(function() {
        iframe.focus();
        iframe.contentWindow.print();
      }, 1);
    };
  }

  iframe.src = url;
}
Nicolas BADIA avatar Mar 27 '2014 17:03 Nicolas BADIA