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");
}
답변
사용자 정의 클래스를 생성하여 콘텐츠 유형을 수정하고 응답에 파일을 추가 할 수 있습니다.
답변
나는이 질문이 오래되었다는 것을 알고 있지만 비슷한 것을 찾을 수 없기 때문에 이것을 공유 할 것이라고 생각했습니다.
나는 정상으로 내보기 / 모델을 만들고 싶었 면도기를 사용 하고는 한 PDF 파일로 렌더링 .
이렇게하면 iTextSharp를 사용하여 문서를 레이아웃하는 방법을 알아내는 대신 표준 html 출력을 사용하여 pdf 프레젠테이션을 제어 할 수있었습니다.
프로젝트 및 소스 코드는 Nuget 설치 지침과 함께 여기에서 사용할 수 있습니다.
https://github.com/andyhutch77/MvcRazorToPdf
Install-Package MvcRazorToPdf