Tengo una llamada AJAX a la página create_pdf.php :
$('body').on('click', '.PrintButtonWithClass', function (event) { var1 = $('#id1').val(); var2 = $('#id2').val(); dataString='var1='+var1+'&var2='+var2+'&pdf_name=PdfName&pdf_creator=myname'; $.ajax({ type: 'post', url: '/path/to/createpdf/file/create_pdf.php', data: dataString, success: function (data) { alert('success'); } }); }); En create_pdf.php intenté usar esta línea para descargar el archivo:
$pdf->Output(str_replace(' ','_',utf8_decode($_POST['pdf_name'])).'.pdf', 'D'); Probé también los parámetros FD e I sin éxito, el archivo no se descarga.
¿Cómo puedo forzar la descarga del archivo creado sin guardarlo en el servidor web y sin redirigir al usuario a ninguna otra página? Quiero que permanezca en la misma página y que el navegador muestre un (cuadro de diálogo de descarga o vista previa) para el PDF. ¿Hay alguna forma de hacerlo?
EDITAR: create_pdf.php está esperando variables POST. y los usa para crear el HMTL para el pdf.
Puede intentar enviar el formulario a una nueva ventana (como una ventana emergente):
<form method="post" id="myform" action="your_url"> <input name="param1"> </form>y en javascript
// create popup window var wind = window.open('about:blank', '__foo', 'width=700,height=500,status=yes,resizable=yes,scrollbars=yes'); // submit form to popup window $("#myform").attr("target", "__foo");No olvide enviar el encabezado de tipo de contenido desde php:
header("Content-Type", "application/pdf");Editar: los navegadores deben mostrar el contenido de su pdf y también mostrar las opciones de descarga o impresión. El código no está probado, pero creo que haría lo que solicitó;
Encontré una solución para mi problema.
Hice una llamada AJAX dentro de otra llamada AJAX .
la primera llamada AJAX crea el archivo en webServer y abre el archivo en una nueva ventana.
En su parámetro de éxito hago lo siguiente:
La segunda llamada AJAX que elimina el archivo del Servidor.
$.ajax({ type: 'post', url: '/path/to/create_pdf.php', data: dataString, success: function (data) { window.open( data, '_blank' // <- This is what makes it open in a new window. ); window.setTimeout(function () { dataString2 = 'Downloaded=true'; $.ajax({ type: 'post', url: '/path/to/create_pdf.php', data: dataString2, success: function (data) { alert(data); }, // handler if second request succeeds }); }, 5000); }, });Usando esta respuesta a mi solicitud similar: envíe un archivo csv desde php al navegador
Necesitaba (1) obtener y mostrar un pdf en otra ventana; y (2) obtenga un archivo CSV y solicite guardarlo.
Tengo 2 botones simples en la página ( http://potoococha.net/ ) para cada uno. Aquí está el código:
function getCSVText(evt) { if (currentChecklistCountry) { var form = $('<form method="post" action="../php/sendCSV.php?country=' + currentChecklistCountry + '"></form>'); $('body').append(form); form.submit(); form.remove(); } else checklistCountryButton.classList.add("needsAttention"); } function openChecklistPage() { if (!currentChecklistCountry) { checklistCountryButton.innerHTML = "Select Country"; checklistCountryButton.classList.add("needsAttention"); return; } if (gNumDays == undefined) gNumDays = 12; vars = "?country=" + currentChecklistCountry; vars += "&num_days=" + gNumDays; vars += "&line_nos=" + lineNumbers.checked; vars += "&left_check=" + leftCheck.checked; vars += "&endemics=" + showEndemics.checked; vars += "&sci_names=" + !sciNames.checked; vars += "&italics=" + !italics.checked; window.open( '../php/makePDF.php' + vars, '_blank' ); }Entonces, los métodos getCSVText() descargan un archivo usando un formulario temporal agregado y luego eliminado inmediatamente, y openChecklistPage() abre con éxito otra ventana del navegador con un archivo pdf. El archivo pdf nunca se guarda en el servidor. El archivo CSV ya está almacenado allí y acaba de recuperarse. Quizás pueda modificar el código para sus propósitos.