Tengo este código de demostración para iTextSharp
Document document = new Document();
try
{
PdfWriter.GetInstance(document, new FileStream("Chap0101.pdf", FileMode.Create));
document.Open();
document.Add(new Paragraph("Hello World"));
}
catch (DocumentException de)
{
Console.Error.WriteLine(de.Message);
}
catch (IOException ioe)
{
Console.Error.WriteLine(ioe.Message);
}
document.Close();
¿Cómo consigo que el controlador devuelva el documento pdf al navegador?
EDITAR:
Al ejecutar este código, se abre Acrobat, pero aparece el mensaje de error "El archivo está dañado y no se pudo reparar".
public FileStreamResult pdf()
{
MemoryStream m = new MemoryStream();
Document document = new Document();
PdfWriter.GetInstance(document, m);
document.Open();
document.Add(new Paragraph("Hello World"));
document.Add(new Paragraph(DateTime.Now.ToString()));
m.Position = 0;
return File(m, "application/pdf");
}
¿Alguna idea de por qué esto no funciona?
c#
asp.net
asp.net-mvc
pdf
itextsharp
Tony Borf
fuente
fuente
Respuestas:
Regresar a
FileContentResult
. La última línea en la acción de su controlador sería algo como:Si está generando este PDF dinámicamente, puede ser mejor usar a
MemoryStream
y crear el documento en la memoria en lugar de guardarlo en un archivo. El código sería algo como:fuente
Lo tengo funcionando con este código.
fuente
using
declaración en ningún ejemplo que pueda encontrar ... ¿No es necesario aquí? Creo que tienes al menos 3 objetos desechables ...Debes especificar:
Para que el archivo se abra directamente en el navegador en lugar de descargarlo
fuente
Si devuelve un
FileResult
de su método de acción y usa elFile()
método de extensión en el controlador, hacer lo que quiera es bastante fácil. Hay modificaciones en elFile()
método que tomará el contenido binario del archivo, la ruta al archivo o unStream
.fuente
Me he encontrado con problemas similares y me he encontrado con una solución. He utilizado dos puestos, uno de pila que muestra el método para volver para su descarga y otro uno que muestra una solución de trabajo para iTextSharp y MVC.
fuente
Puede crear una clase personalizada para modificar el tipo de contenido y agregar el archivo a la respuesta.
http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx
fuente
Sé que esta pregunta es antigua, pero pensé en compartirla ya que no pude encontrar nada similar.
Quería crear mis vistas / modelos de forma normal usando Razor y renderizarlos como PDF .
De esta manera tuve control sobre la presentación en pdf usando la salida html estándar en lugar de averiguar cómo diseñar el documento usando iTextSharp.
El proyecto y el código fuente están disponibles aquí con las instrucciones de instalación de nuget:
https://github.com/andyhutch77/MvcRazorToPdf
fuente
FileStreamResult
ciertamente funciona. Pero si nos fijamos en Microsoft Docs , heredaActionResult -> FileResult
, que tiene otra clase derivadaFileContentResult
. "Envía el contenido de un archivo binario a la respuesta". Entonces, si ya tiene elbyte[]
, debería usarloFileContentResult
en su lugar.fuente
Normalmente haría un Response.Flush seguido de un Response.Close, pero por alguna razón a la biblioteca iTextSharp no parece gustarle esto. Los datos no pasan y Adobe cree que el PDF está dañado. Deje fuera la función Response.Close y vea si sus resultados son mejores:
fuente
si el nombre de archivo se genera dinámicamente, entonces cómo definir el nombre de archivo aquí, se genera a través de guid aquí.
fuente
Ver pagina:
Controlador de escaneo:
fuente