tôi đã có thể cuối cùng đã viết pdf với hệ thống thư mục bằng cách thay đổi cơ sở mã của RazorPDF Phương thức render. Phương pháp Rendor tạo ra một đối tượng PdfWriter được kết hợp với dòng phản hồi:
// Associate output with response stream
var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream);
pdfWriter.CloseStream = false;
Giải pháp là để tạo ra một đối tượng PdfWriter rằng có liên quan đến một đối tượng FileStream như minh họa dưới đây:
// Create the pdf file in the directory system
var fileStream = new FileStream(myPdfFilePath, FileMode.Create);
var pdfWriter2 = PdfWriter.GetInstance(document, fileStream);
tôi sau đó đóng các đối tượng:
fileStream.Close();
pdfWriter.Close();
pdfWriter2.Close();
Tôi đã cơ bản kết hợp các lớp PdfResult và PdfView của RazorPDF vào dự án của riêng tôi và thay đổi đáng kể mã. Lý do là vì tôi cũng phải mã hóa các cuộc gọi đến một lớp email đã gửi bản pdf cho người dùng.
Phương pháp đầy đủ Render được hiển thị dưới đây:
public void Render(ViewContext viewContext, TextWriter writer)
{
// generate view into string
var sb = new System.Text.StringBuilder();
TextWriter tw = new System.IO.StringWriter(sb);
myResult.View.Render(viewContext, tw);
var resultCache = sb.ToString();
// detect itext (or html) format of response
XmlParser parser;
using (var reader = GetXmlReader(resultCache))
{
while (reader.Read() && reader.NodeType != XmlNodeType.Element)
{
// no-op
}
if (reader.NodeType == XmlNodeType.Element && reader.Name == "itext")
parser = new XmlParser();
else
parser = new HtmlParser();
}
// Create a document processing context
var document = new Document();
document.Open();
// Associate output with response stream
var pdfWriter = PdfWriter.GetInstance(document, viewContext.HttpContext.Response.OutputStream);
pdfWriter.CloseStream = false;
// Create the pdf file in the directory system
var fileStream = new FileStream(myPdfFilePath, FileMode.Create);
var pdfWriter2 = PdfWriter.GetInstance(document, fileStream);
// this is as close as we can get to being "success" before writing output
// so set the content type now
viewContext.HttpContext.Response.ContentType = "application/pdf";
// parse memory through document into output
using (var reader = GetXmlReader(resultCache))
{
parser.Go(document, reader);
}
fileStream.Close();
// Send an email to the claimant
Thread.Sleep(100);
if (File.Exists(myPdfFilePath))
{
var subject = "PDF Documents";
var body = Config.GetContent(ContentParams.CLAIM_DOCUMENT_EMAIL_BODY_TEXT);
bool success;
string errorMessage;
Email.Send(myEmailAddress, subject, body, out success, out errorMessage, myPdfFilePath);
}
pdfWriter.Close();
pdfWriter2.Close();
}
Nó sẽ được tốt đẹp nếu khả năng này bằng cách nào đó đưa vào dự án RazorPDF hiện hành.
Nguồn
2013-08-30 17:45:58
Bạn đã giải quyết vấn đề này chưa? Tôi đang gặp vấn đề tương tự. – Gmorken
Tôi vẫn gặp sự cố tương tự. Chưa có giải pháp nào. –
Bạn đã xem bài đăng này http://stackoverflow.com/questions/5826649/returning-a-file-to-view-download-in-mvc? Bạn có thể thêm tiêu đề 'Content-Disposition' trước khi gọi' PdfResult() '- cho dù nó hoạt động hay không vẫn còn để được nhìn thấy. –