c# - Archivo PDF generado de iTextSharp: ¿Cómo enviar el pdf al cliente y agregar un aviso?
extjs prompt (5)
Actualmente está guardando su archivo en el servidor de archivos, sobrescribiendo el mismo pdf con cada solicitud. Y probablemente cause errores si obtiene dos solicitudes de un PDF al mismo tiempo.
Use Response
para devolver el PDF (desde el flujo de memoria) al usuario y omita la escritura del PDF en un archivo localmente en su servidor.
El navegador le preguntará al usuario dónde debe guardarse el archivo. Algo como:
Response.ContentType = "Application/pdf";
myMemoryStream.CopyTo(Response.OutputStream);
También mire la respuesta de Alun , usando content-disposition
puede proponer un nombre de archivo para el usuario.
He generado un pdf usando iTextSharp, cuando está creado lo guarda automáticamente en la ubicación provista en mi código en el servidor, no en el lado del cliente y, por supuesto, sin decirle nada al usuario.
Necesito enviarlo al cliente y necesito solicitar un cuadro de diálogo para preguntar al usuario dónde quiere guardar su pdf.
¿Cómo puedo hacer esto por favor?
este es mi código pdf:
using (MemoryStream myMemoryStream = new MemoryStream())
{
Document document = new Document();
PdfWriter PDFWriter = PdfWriter.GetInstance(document, myMemoryStream);
document.AddHeader("header1", "HEADER1");
document.Open();
//..........
document.Close();
byte[] content = myMemoryStream.ToArray();
// Write out PDF from memory stream.
using (FileStream fs = File.Create(HttpContext.Current.Server.MapPath("~//report.pdf")))
{
fs.Write(content, 0, (int)content.Length);
}
EDITAR
este es un ejemplo del resultado que quiero http://examples.extjs.eu/?ex=download
gracias a sus respuestas, modifiqué mi código a esto:
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AppendHeader( "Content-Disposition", "attachment; filename=test.pdf");
using (MemoryStream myMemoryStream = new MemoryStream())
{
Document document = new Document();
PdfWriter PDFWriter = PdfWriter.GetInstance(document, myMemoryStream);
document.AddHeader("Content-Disposition", "attachment; filename=wissalReport.pdf");
document.Open();
//..........
document.Close();
byte[] content = myMemoryStream.ToArray();
HttpContext.Current.Response.Buffer = false;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.AppendHeader("content-disposition","attachment;filename=" + "my_report.pdf");
HttpContext.Current.Response.ContentType = "Application/pdf";
//Write the file content directly to the HTTP content output stream.
HttpContext.Current.Response.BinaryWrite(content);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
pero me sale este error:
Uncaught Ext.Error: You''re trying to decode an invalid JSON String:
%PDF-1.4 %���� 3 0 obj <</Type/XObject/Subtype/Image/Width 994/Height 185/Length 13339/ColorSpace/DeviceGray/BitsPerComponent 8/Filter/FlateDecode>>stream x���|E�
...........
Estoy absolutamente seguro de que mi itextsharp para crear pdf es correcto porque puedo guardarlo en el servidor, pero eso no es lo que tengo que hacer, cuando trato de enviarlo al cliente recibí el error anterior
gracias por adelantado
Debe enviar un encabezado de disposición de contenido al navegador de los usuarios. Desde la memoria, el código es algo así:
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition","attachment; filename=nameofthefile.pdf");
En el caso de una aplicación web, probablemente desee transmitir el pdf como binario a usuario, que abriría el pdf o le indicaría al usuario que guarde el archivo.
Recuerde que la generación de PDF está sucediendo en el servidor, incluso si el usuario proporciona la ruta, no será de ninguna utilidad en el servidor. Ver los siguientes enlaces:
En su caso, está generando el archivo y, por lo tanto, ya tendrá una secuencia binaria en lugar de un archivo, por lo tanto, puede usar directamente Response.BinaryWrite en lugar de Response.WriteFile .
Muestra modificada:
Response.Buffer = false;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
//Set the appropriate ContentType.
Response.ContentType = "Application/pdf";
//Write the file content directly to the HTTP content output stream.
Response.BinaryWrite(content);
Response.Flush();
Response.End();
No necesita usar MemoryStream
. Use Response.OutputStream
lugar. Para eso está ahí. No es necesario utilizar Response.BinaryWrite()
o cualquier otra llamada para escribir explícitamente el documento; iTextSharp se encarga de escribir en la transmisión cuando usa Response.OutputStream
.
Aquí hay un ejemplo de trabajo simple:
Response.ContentType = "application/pdf";
Response.AppendHeader(
"Content-Disposition",
"attachment; filename=test.pdf"
);
using (Document document = new Document()) {
PdfWriter.GetInstance(document, Response.OutputStream);
document.Open();
document.Add(new Paragraph("This is a paragraph"));
}
A continuación, se indica cómo agregar los encabezados HTTP adecuados . (obteniendo el mensaje para guardar el archivo) Y si su código está en un web form
, (botón click handler), agregue Response.End()
al ejemplo de código anterior después de using
instrucción para que no se anexe el resultado HTML del formulario web el documento PDF.
SOLUCIONADO
El error proviene de la operación de envío que intenta interpretar la respuesta que no puede porque no está en un formato conocido.
Acabo de establecer window.location para descargar archivos y esto funciona bien.
{
xtype:''button'',
text: ''Generate PDF'',
handler: function () {
window.location = ''/AddData.ashx?action=pdf'';
}
}
En lugar de establecer la ubicación, también puede hacer window.open ().
Si el archivo se descargará o abrirá depende de la configuración del navegador.