【发布时间】:2013-05-02 00:15:12
【问题描述】:
我正在使用 C#、MVC3 和 .NET 3.5 在 Azure VM(通过 Web 角色)中使用 Prince XML 生成 PDF 文件。带有PdfFilter() 属性标记的操作方法将 HTML 转发到 Prince XML;创建 PDF 后,使用以下代码将新文件写入客户端:
public class PdfFilterAttribute : ActionFilterAttribute
{
private HtmlTextWriter tw;
private StringWriter sw;
private StringBuilder sb;
private HttpWriter output;
public override void OnActionExecuting(ActionExecutingContext context)
{
// Hijack the HttpWriter and write it to a StringBuilder instead of the normal response (http://goo.gl/RCNey).
sb = new StringBuilder();
sw = new StringWriter(sb);
tw = new HtmlTextWriter(sw);
output = (HttpWriter)context.RequestContext.HttpContext.Response.Output;
context.RequestContext.HttpContext.Response.Output = tw;
}
public override void OnResultExecuted(ResultExecutedContext context)
{
// Get the HTML from the request.
string html = sb.ToString();
// PdfController is where the PDF generation logic lives; instantiate it.
var pdfController = new PdfController();
// Generate a user-friendly filename for the PDF.
string filename = pdfController.GetPdfFilename(html);
// Generate the PDF and convert it to a byte array.
FileInfo pdfInfo = pdfController.HtmlToPdf(html);
// If the PDF or a user-friendly filename could not be generated, return the raw HTML instead.
if (pdfInfo == null || !pdfInfo.Exists || pdfInfo.Length == 0 || String.IsNullOrWhitespace(filename))
{
output.Write(html);
return;
}
// If a PDF was generated, stream it to the browser for downloading.
context.HttpContext.Response.Clear();
context.HttpContext.Response.AddHeader("Content-Type", "application/pdf");
context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\";");
context.HttpContext.Response.WriteFile(pdfInfo.FullName);
context.HttpContext.Response.Flush();
context.HttpContext.Response.Close();
context.HttpContext.Response.End();
}
}
我已确认已在服务器上成功创建 PDF。但是,当我尝试通过调用Response.WriteFile() 将其发送回客户端时,客户端只会将下载内容视为 0 字节的 PDF——它无法使用。
没有任何异常被抛出,Prince XML 日志文件表明这些文件都已成功生成。我已经通过 C# 并通过远程桌面进入 Azure VM 验证了 PDF 确实正在创建并且可以通过 PDF 阅读器在那里读取。
还有什么我可能会遗漏的吗?提前致谢!
【问题讨论】:
标签: c# pdf-generation httpresponse azure-web-roles princexml