2010-05-10 155 views
21

que tiene una cadena con formato PDF que se parece aApertura PDF cadena en una nueva ventana con javascript

%PDF-1.73 0 obj<<< /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R/Contents 4 0 R>> endobj4 0 obj<> streamx��R=o�0��+��=|vL�R���l�-��ځ,���Ge�JK����{���Y5�����Z˯k�vf�a��`G֢ۢ��Asf�z�ͼ��`%��aI#�!;�t���GD?!���<�����B�b�� 

... 

00000 n 0000000703 00000 n 0000000820 00000 n 0000000926 00000 n 0000001206 00000 n 0000001649 00000 n trailer << /Size 11 /Root 10 0 R /Info 9 0 R >>startxref2015%%EOF 

Estoy tratando de abrir esta cadena en una nueva ventana como un archivo PDF. Cada vez que uso window.open() y escribo la cadena en la nueva pestaña, cree que el texto debe ser el contenido de un documento HTML. Quiero que reconozca que este es un archivo PDF.

Cualquier ayuda es muy apreciada

+0

¿Cómo está "escribiendo" th es cadena? ¿Quieres decir que es devuelto por el back-end (si es así, ¿qué plataforma?). Si el backend genera los datos PDF, asegúrese de configurar el encabezado Content-Type correcto. –

+0

Mejor respuesta: No debería usar AJAX en esta situación. –

+0

@Josh - Él nunca mencionó AJAX. Podría ser una página HTML independiente en un CD que genere dinámicamente cadenas personalizadas para todo lo que sabemos. Dudo que esto sea posible sin embargo. –

Respuesta

16

Es posible que desee explorar el uso del URI de datos. Se vería algo así como

window.open("data:application/pdf," + escape(pdfString)); 

no fue inmediatamente capaz de conseguir que esto funcione, es posible porque el formateo de la cadena binaria proporcionada. También usualmente uso datos codificados en base64 cuando uso el URI de datos. Si usted es capaz de pasar el contenido desde el servidor codificado puede utilizar ..

window.open("data:application/pdf;base64, " + base64EncodedPDF); 

Esperemos que esta es la dirección correcta para lo que necesita. También tenga en cuenta que esto no funcionará en IE6/7 porque no son compatibles con los URI de datos.

+2

tampoco funcionará en IE 8+, porque el tamaño de la URL probablemente sea> 2048 caracteres límite que IE impone a las URL – Jeff

+0

Creo que esta restricción no se aplica a URI de datos, solo URL. IE8 tiene un límite URI de datos de 32 KB que se eliminó en IE9. –

+0

Referencia: http://msdn.microsoft.com/en-us/library/cc848897(v=vs.85).aspx –

4

Póster por primera vez, así que espero que se vea bien.

Tuve este problema funcionando con una solicitud de envío de FedEx. Realizo la solicitud con AJAX. La respuesta incluye el seguimiento de #, costo, así como una cadena de pdf que contiene la etiqueta de envío.

Aquí es lo que hice:

Añadir un formulario:

<form id='getlabel' name='getlabel' action='getlabel.php' method='post' target='_blank'> 
<input type='hidden' id='pdf' name='pdf'> 
</form> 

el uso de JavaScript para rellenar el valor del campo oculto con la cadena pdf y enviar el formulario.

Dónde getlabel.php:

<? 
header('Content-Type: application/pdf'); 
header('Content-Length: '.strlen($_POST["pdf"])); 
header('Content-Disposition: inline;'); 
header('Cache-Control: private, max-age=0, must-revalidate'); 
header('Pragma: public'); 
print $_POST["pdf"]; 
?> 
+0

El problema con este método es que no hay forma de informar al usuario cuando el documento se ha descargado. – crush

+0

Creo que target = '_ blank' informará al usuario? –

18
window.open("data:application/pdf," + escape(pdfString)); 

El uno por encima de pegar el contenido codificado en URL. Eso hace que la restricción de la longitud del contenido en URL y, por lo tanto, la carga del archivo PDF falle (debido a contenido incompleto).

+3

advertencia: Chrome detecta esto como pop-up y bloquea –

+2

Esto no funcionará en MSIE debido al carácter máximo de 2048 URL que MS decidió imponer. – Jeff

+2

Este límite no se aplica a los URI de datos, solo a las URL de navegación normales. Referencia: http://msdn.microsoft.com/en-us/library/cc848897(v=vs.85).aspx –

5

Basado de otras respuestas viejas:

escape() función ahora es obsoleto,

Uso encodeURI() o encodeURIComponent() lugar.

Ejemplo que trabajaba en mi situación:

window.open("data:application/pdf," + encodeURI(pdfString)); 

Codificación feliz!

+0

Porque esto abre una nueva pestaña donde en el URL está el contenido PDF, ¿hay un límite de PDF? Probé muchas solificaciones y solo funciona, pero ... ¿si tengo un PDF de 2 MB? – Mistre83

+1

@ Mistre83 - No estoy del todo seguro de entender su pregunta, pero la he usado varias veces en algunos archivos PDF bastante grandes y funcionó, no puedo probar ahora, probarla en un PDF grande y ver, debería funcionar, si hay un límite de tamaño, supongo que es bastante grande, como 2-4GB (estimaciones absolutas) – EaziLuizi

10

Comprendo que esto es una pregunta bastante viejo, pero había lo mismo llegar a la actualidad y se acercó con la siguiente solución:

doSomethingToRequestData().then(function(downloadedFile) { 
    // create a download anchor tag 
    var downloadLink  = document.createElement('a'); 
    downloadLink.target = '_blank'; 
    downloadLink.download = 'name_to_give_saved_file.pdf'; 

    // convert downloaded data to a Blob 
    var blob = new Blob([downloadedFile.data], { type: 'application/pdf' }); 

    // create an object URL from the Blob 
    var URL = window.URL || window.webkitURL; 
    var downloadUrl = URL.createObjectURL(blob); 

    // set object URL as the anchor's href 
    downloadLink.href = downloadUrl; 

    // append the anchor to document body 
    document.body.appendChild(downloadLink); 

    // fire a click event on the anchor 
    downloadLink.click(); 

    // cleanup: remove element and revoke object URL 
    document.body.removeChild(downloadLink); 
    URL.revokeObjectURL(downloadUrl); 
}); 
+1

¡Esta es una buena solución! Sin embargo, solo funciona en IE10 +, de acuerdo con [MDN] (https://developer.mozilla.org/de/docs/Web/API/URL/createObjectURL) –

+0

en Chrome obtengo document.body.append no es una función y por lo tanto Usé: document.getElementsByTagName ('body') [0] .appendChild (downloadLink); –

+0

Gracias @ manuel-84, encontraste un error tipográfico. Debería haber sido 'appendChild' desde el principio. –

8

Sólo a título informativo, el siguiente

window.open("data:application/pdf," + encodeURI(pdfString)); 

ya no funciona en Chrome. Ayer, me encontré con el mismo problema e intenté con esta solución, pero no funcionó (es 'No se permite navegar en el marco superior a la URL de datos'). Ya no puedes abrir la URL de datos directamente en una nueva ventana. Pero puede envolverlo en iframe y abrirlo en una ventana nueva como la siguiente. =)

let pdfWindow = window.open("") 
pdfWindow.document.write("<iframe width='100%' height='100%' src='data:application/pdf;base64, " + encodeURI(yourDocumentBase64VarHere)+"'></iframe>") 
1

Una sugerencia es que utilice una biblioteca en PDF como PDFJS.

Tengo que adjuntar, el siguiente "data:application/pdf;base64" + su cadena de PDF, y establecer el src de su elemento a eso.

intento con este ejemplo:

var pdfsrc = "data:application/pdf;base64" + "67987yiujkhkyktgiyuyhjhgkhgyi...n" 

<pdf-element id="pdfOpen" elevation="5" downloadable src="pdfsrc" ></pdf-element> 

espero que ayude :)

+0

Ahorrador de vida, mi cliente tiene una aversión a que los archivos .dpfs se descarguen automáticamente a la PC, solo quieren poder imprimir desde el navegador. –

1

Éste trabajó para mí.

window.open("data:application/octet-stream;charset=utf-16le;base64,"+data64); 

Esto se trabajaba demasiado

let a = document.createElement("a"); 
a.href = "data:application/octet-stream;base64,"+data64; 
a.download = "documentName.pdf" 
a.click(); 
0

Sólo codifican la cadena con formato PDF en la base 64. Entonces que debe hacer:

$pdf = 'data:application/pdf;base64,'.$base64EncodedString; 

retorno a esta javascript y se abre en una nueva ventana :

window.open(return); 
Cuestiones relacionadas