2011-06-02 52 views
9

我想保存一個已編輯的pdf模板。我怎麼做?如何保存已編輯的pdf?

using (MemoryStream ms = new MemoryStream()) 
{  
    PdfReader reader = new PdfReader("~/Content/Documents/Agreement.pdf"); 
    PdfStamper formFiller = new PdfStamper(reader, ms); 
    AcroFields formFields = formFiller.AcroFields; 
    formFields.SetField("Name", formData.Name); 
    formFields.SetField("Location", formData.Address); 
    formFields.SetField("Date", DateTime.Today.ToShortDateString()); 
    formFields.SetField("Email", formData.Email); 
    formFiller.FormFlattening = true; 
    formFiller.Close(); 
} 
+2

我猜測有一個'PdfWriter'類需要'Stream'。 – Oded 2011-06-02 20:04:14

+1

也許你可以告訴我們你正在使用哪個PDF庫? – 2011-06-02 21:11:26

回答

3

this example,你只需要使用一個FileStream,而不是一個MemoryStream的。

的代碼應該是這樣的:

string newFile = @".\FormDocument_out.pdf";  
FileStream fs = new FileStream(newFile, FileMode.Create);  
try 
{ 
     PdfReader reader = new PdfReader("~/Content/Documents/Agreement.pdf"); 
     PdfStamper formFiller = new PdfStamper(reader, fs); 
     AcroFields formFields = formFiller.AcroFields; 
     formFields.SetField("Name", formData.Name); 
     formFields.SetField("Location", formData.Address); 
     formFields.SetField("Date", DateTime.Today.ToShortDateString()); 
     formFields.SetField("Email", formData.Email); 
     formFiller.FormFlattening = true; 
     formFiller.Close(); 
} 
catch(Exception) 
{ 
    throw; 
} 
finally 
{ 
    fs.Close(); 
} 
+1

包含異常處理是否明智? – 2011-06-08 12:31:56

+0

@Jamie完成,謝謝,隨時添加更多,如果你發現它適合:) – yms 2011-06-08 12:51:45

+0

你正在手動關閉FileStream,所以你可以刪除Using語句,在try/catch之外聲明FileStream和PdfReader並初始化它們在Try裏面。目前,你基本上已經嘗試了嘗試,終於趕上了 – 2011-06-09 12:08:09

0

下面是下載PDF模板類。

public abstract class PdfTemplateHandler : IHttpHandler 
{ 
    public virtual bool DownloadAsAttachment 
    { 
     get 
     { 
      return true; 
     } 
    } 

    protected virtual TimeSpan PdfTemplateCacheDuration 
    { 
     get 
     { 
      return TimeSpan.FromMinutes(30); 
     } 
    } 

    protected virtual string PdfTemplateCacheKey 
    { 
     get 
     { 
      return string.Format("__PDF_Template[{0}]", TemplatePath); 
     } 
    } 

    protected string DownloadFileName { get; set; } 

    protected HttpContext Context { get; private set; } 

    protected HttpResponse Response { get; private set; } 

    protected HttpRequest Request { get; private set; } 

    #region IHttpHandler Members 

    public bool IsReusable 
    { 
     get { return false; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 

     Context = context; 
     Response = context.Response; 
     Request = context.Request; 

     try 
     { 
      LoadDataInternal(); 
     } 
     catch (ThreadAbortException) 
     { 
      // no-op 
     } 
     catch (Exception ex) {    
      Logger.LogError(ex); 
      Response.Write("Error"); 
      Response.End(); 
     } 

     Response.BufferOutput = true; 
     Response.ClearHeaders(); 
     Response.ContentType = "application/pdf"; 

     if (DownloadAsAttachment) 
     { 
      Response.AddHeader("Content-Disposition", "attachment; filename=" + 
       (string.IsNullOrEmpty(DownloadFileName) ? context.Session.SessionID + ".pdf" : DownloadFileName)); 
     } 

     PdfStamper pst = null; 
     try 
     { 
      PdfReader reader = new PdfReader(GetTemplateBytes()); 
      pst = new PdfStamper(reader, Response.OutputStream); 
      var acroFields = pst.AcroFields; 

      pst.FormFlattening = true; 
      pst.FreeTextFlattening = true; 
      pst.SetFullCompression(); 

      SetFieldsInternal(acroFields); 
      pst.Close(); 
     } 
     finally 
     { 
      if (pst != null) 
       pst.Close(); 
     } 
    } 

    #endregion 

    #region Abstract Members for overriding and providing functionality 

    protected abstract string TemplatePath { get; } 

    protected abstract void LoadDataInternal(); 

    protected abstract void SetFieldsInternal(AcroFields acroFields); 

    #endregion 

    protected virtual byte[] GetTemplateBytes() 
    { 
     var data = Context.Cache[PdfTemplateCacheKey] as byte[]; 
     if (data == null) 
     { 
      data = File.ReadAllBytes(Context.Server.MapPath(TemplatePath)); 
      Context.Cache.Insert(PdfTemplateCacheKey, data, 
       null, DateTime.Now.Add(PdfTemplateCacheDuration), Cache.NoSlidingExpiration); 
     } 
     return data; 
    } 

}