2010-03-18 64 views
3

我正在使用ITextSharp生成pdf,然後將其保存到磁盤並使用Frame進行顯示。從內存加載PDF ASP.Net

該框架有一個名爲src的屬性,我傳遞生成的文件名。

這一切工作正常,我想實現的是將生成的PDF文件傳遞到幀而不保存到磁盤。

HtmlToPdfBuilder builder = new HtmlToPdfBuilder(PageSize.LETTER); 
HtmlPdfPage first = builder.AddPage(); 

//import an entire sheet 
builder.ImportStylesheet(Request.PhysicalApplicationPath + "CSS\\Stylesheet.css"); 
string coupon = CreateCoupon(); 
first.AppendHtml(coupon); 

byte[] file = builder.RenderPdf(); 
File.WriteAllBytes(Request.PhysicalApplicationPath+"final.pdf", file); 
printable.Attributes["src"] = "final.pdf"; 

回答

2

我已經完成了你想要做的事情。你會想創建一個處理程序(.ashx)。創建PDF後,請使用以下代碼將其加載到您的處理程序中:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class MapHandler : IHttpHandler, IReadOnlySessionState 
{ 

    public void ProcessRequest(HttpContext context) { 
     CreateImage(context); 
    } 

    private void CreateImage(HttpContext context) { 

     string documentFullname = // Get full name of the PDF you want to display... 

     if (File.Exists(documentFullname)) { 

      byte[] buffer; 

      using (FileStream fileStream = new FileStream(documentFullname, FileMode.Open, FileAccess.Read, FileShare.Read)) 
      using (BinaryReader reader = new BinaryReader(fileStream)) { 
       buffer = reader.ReadBytes((int)reader.BaseStream.Length); 
      } 

      context.Response.ContentType = "application/pdf"; 
      context.Response.AddHeader("Content-Length", buffer.Length.ToString()); 
      context.Response.BinaryWrite(buffer); 
      context.Response.End(); 

     } else { 
      context.Response.Write("Unable to find the document you requested."); 
     } 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 
+0

+1,這裏也一樣。很好的工作 – 2010-03-18 04:58:31

+0

我想你會誤解 - 他想寫出生成的pdf,而不必將其寫入磁盤。如果您可以將他的pdf生成代碼合併到您的CreateImage函數中,以便在內存中創建pdf並一次寫入響應,那麼這將是一個很好的答案。 – patmortech 2010-03-18 05:45:19