c# net Como devolver PDF ao navegador no MVC?



return pdf asp net mvc (8)

Eu tenho esse código de demonstração 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();

Como obtenho o controlador para retornar o documento pdf para o navegador?

EDITAR:

A execução deste código abre o Acrobat, mas recebo uma mensagem de erro "O arquivo está danificado e não pôde ser reparado"

  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");
    }

Alguma idéia porque isso não funciona?


Retornar um FileContentResult . A última linha na sua ação do controlador seria algo como:

return File("Chap0101.pdf", "application/pdf");

Se você estiver gerando esse PDF dinamicamente, talvez seja melhor usar um MemoryStream e criar o documento na memória em vez de salvar em arquivo. O código seria algo como:

Document document = new Document();

MemoryStream stream = new MemoryStream();

try
{
    PdfWriter pdfWriter = PdfWriter.GetInstance(document, stream);
    pdfWriter.CloseStream = false;

    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();

stream.Flush(); //Always catches me out
stream.Position = 0; //Not sure if this is required

return File(stream, "application/pdf", "DownloadName.pdf");

Você normalmente faria um Response.Flush seguido por um Response.Close, mas por algum motivo a biblioteca iTextSharp não parece gostar disso. Os dados não passam e a Adobe acha que o PDF está corrompido. Deixe de fora a função Response.Close e veja se seus resultados são melhores:

Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=file.pdf"); // open in a new window
Response.OutputStream.Write(outStream.GetBuffer(), 0, outStream.GetBuffer().Length);
Response.Flush();

// For some reason, if we close the Response stream, the PDF doesn't make it through
//Response.Close();

se você retornar dados binários var do banco de dados para exibir PDF no pop-up ou navegador significa seguir este código: -

Ver pagina:

@using (Html.BeginForm("DisplayPDF", "Scan", FormMethod.Post))
    {
        <a href="javascript:;" onclick="document.forms[0].submit();">View PDF</a>
    }

Controlador de digitalização:

public ActionResult DisplayPDF()
        {
            byte[] byteArray = GetPdfFromDB(4);
            MemoryStream pdfStream = new MemoryStream();
            pdfStream.Write(byteArray, 0, byteArray.Length);
            pdfStream.Position = 0;
            return new FileStreamResult(pdfStream, "application/pdf");
        }

        private byte[] GetPdfFromDB(int id)
        {
            #region
            byte[] bytes = { };
            string constr = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandText = "SELECT Scan_Pdf_File FROM PWF_InvoiceMain WHERE [email protected] and Enabled = 1";
                    cmd.Parameters.AddWithValue("@Id", id);
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        if (sdr.HasRows == true)
                        {
                            sdr.Read();
                            bytes = (byte[])sdr["Scan_Pdf_File"];
                        }
                    }
                    con.Close();
                }
            }

            return bytes;
            #endregion
        }


Eu sei que essa pergunta é antiga, mas eu pensei em compartilhar isso, pois não encontrei nada parecido.

Eu queria criar minhas views / models normalmente usando o Razor e tê-los renderizados como PDFs .

Desta forma, eu tinha controle sobre a apresentação em pdf usando saída html padrão, em vez de descobrir como fazer o layout do documento usando o iTextSharp.

O projeto e o código-fonte estão disponíveis aqui com as instruções de instalação do nuget:

https://github.com/andyhutch77/MvcRazorToPdf

Install-Package MvcRazorToPdf

HttpContext.Response.AddHeader("content-disposition","attachment; filename=form.pdf");

Se o nome do arquivo estiver gerando dinamicamente, então, como definir o nome do arquivo aqui, ele está sendo gerado através do guid aqui.


Você deve especificar:

Response.AppendHeader("content-disposition", "inline; filename=file.pdf");
return new FileStreamResult(stream, "application/pdf")

Para o arquivo ser aberto diretamente no navegador em vez de ser baixado


Se você retornar um FileResult de seu método de ação e usar o método de extensão File() no controlador, é muito fácil fazer o que você deseja. Há substituições no método File() que levará o conteúdo binário do arquivo, o caminho para o arquivo ou um Stream .

public FileResult DownloadFile()
{
    return File("path\\to\\pdf.pdf", "application/pdf");
}




itextsharp