[C#] MVC에서 PDF를 브라우저로 반환하는 방법은 무엇입니까?

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

컨트롤러에서 pdf 문서를 브라우저로 반환하려면 어떻게해야합니까?

편집하다:

이 코드를 실행하면 Acrobat이 열리지 만 “파일이 손상되어 복구 할 수 없습니다”라는 오류 메시지가 나타납니다.

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

이것이 작동하지 않는 이유는 무엇입니까?



답변

를 반환합니다 FileContentResult. 컨트롤러 작업의 마지막 줄은 다음과 같습니다.

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

이 PDF를 동적으로 생성하는 경우를 사용 MemoryStream하여 파일에 저장하는 대신 메모리에 문서를 만드는 것이 더 나을 수 있습니다 . 코드는 다음과 같습니다.

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


답변

이 코드로 작업했습니다.

using iTextSharp.text;
using iTextSharp.text.pdf;

public FileStreamResult pdf()
{
    MemoryStream workStream = new MemoryStream();
    Document document = new Document();
    PdfWriter.GetInstance(document, workStream).CloseStream = false;

    document.Open();
    document.Add(new Paragraph("Hello World"));
    document.Add(new Paragraph(DateTime.Now.ToString()));
    document.Close();

    byte[] byteInfo = workStream.ToArray();
    workStream.Write(byteInfo, 0, byteInfo.Length);
    workStream.Position = 0;

    return new FileStreamResult(workStream, "application/pdf");
}


답변

다음을 지정해야합니다.

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

파일을 다운로드하는 대신 브라우저에서 직접 열 려면


답변

FileResult액션 메서드에서 를 반환 File()하고 컨트롤러 에서 확장 메서드를 사용 하면 원하는 작업을 수행하는 것이 매우 쉽습니다. 온 재정이 있습니다 File()파일, 또는에 경로를 파일의 바이너리 컨텐츠를 취할 것입니다 방법 Stream.

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


답변

비슷한 문제가 발생했으며 해결책을 찾았습니다. 나는이 글에서 하나 사용 스택 방법 쇼 다운로드 및 서로를 반환하는 것을 하나 보여 그 ItextSharp과 MVC를위한 작업 솔루션을.

public FileStreamResult About()
{
    // Set up the document and the MS to write it to and create the PDF writer instance
    MemoryStream ms = new MemoryStream();
    Document document = new Document(PageSize.A4.Rotate());
    PdfWriter writer = PdfWriter.GetInstance(document, ms);

    // Open the PDF document
    document.Open();

    // Set up fonts used in the document
    Font font_heading_1 = FontFactory.GetFont(FontFactory.TIMES_ROMAN, 19, Font.BOLD);
    Font font_body = FontFactory.GetFont(FontFactory.TIMES_ROMAN, 9);

    // Create the heading paragraph with the headig font
    Paragraph paragraph;
    paragraph = new Paragraph("Hello world!", font_heading_1);

    // Add a horizontal line below the headig text and add it to the paragraph
    iTextSharp.text.pdf.draw.VerticalPositionMark seperator = new iTextSharp.text.pdf.draw.LineSeparator();
    seperator.Offset = -6f;
    paragraph.Add(seperator);

    // Add paragraph to document
    document.Add(paragraph);

    // Close the PDF document
    document.Close();

    // Hat tip to David for his code on stackoverflow for this bit
    // /programming/779430/asp-net-mvc-how-to-get-view-to-generate-pdf
    byte[] file = ms.ToArray();
    MemoryStream output = new MemoryStream();
    output.Write(file, 0, file.Length);
    output.Position = 0;

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


    // Return the output stream
    return File(output, "application/pdf"); //new FileStreamResult(output, "application/pdf");
}


답변

사용자 정의 클래스를 생성하여 콘텐츠 유형을 수정하고 응답에 파일을 추가 할 수 있습니다.

http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx


답변

나는이 질문이 오래되었다는 것을 알고 있지만 비슷한 것을 찾을 수 없기 때문에 이것을 공유 할 것이라고 생각했습니다.

나는 정상으로 내보기 / 모델을 만들고 싶었 면도기를 사용 하고는 한 PDF 파일로 렌더링 .

이렇게하면 iTextSharp를 사용하여 문서를 레이아웃하는 방법을 알아내는 대신 표준 html 출력을 사용하여 pdf 프레젠테이션을 제어 할 수있었습니다.

프로젝트 및 소스 코드는 Nuget 설치 지침과 함께 여기에서 사용할 수 있습니다.

https://github.com/andyhutch77/MvcRazorToPdf

Install-Package MvcRazorToPdf