2011-06-02 22 views
9

Düzenlenmiş bir pdf şablonunu kaydetmek istiyorum. Bunu nasıl yaparım?Düzenlenmiş bir pdf'yi nasıl kaydederim?

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

Sanırım bir "Stream" alan bir "PdfWriter" sınıfı var. – Oded

+1

Belki hangi PDF kütüphanesini kullandığınızı söyleyebilir misiniz? –

cevap

3

this example olduğu gibi, sadece bir MemoryStream yerine bir FileStream kullanmak gerekir.

kod aşağıdaki gibi görünmelidir:

İşte
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

İstisna işleme dahil etmek akıllıca olur mu? –

+0

@Jamie Bitti, teşekkürler, uygun bulduğunuzda daha fazlasını eklemekten çekinmeyin :) – yms

+0

FileStream'i manuel olarak kapatıyorsunuz, bu yüzden Use deyimini kaldırabilir, FileStream ve PdfReader'ı try/catch dışında ilan edip bunları başlatabilirsiniz deneyin içinde. Şu anda temelde deneme-yakalamak-nihayet-sonunda nihayet var –

0

PDF indirmek için bir şablon sınıftır.

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; 
    } 

} 
İlgili konular