2014-04-07 13 views
1

我已經成功實現了iTextSharp.text.pdf來填充我們設置的PDF模板文件。目前,該文件正在自動保存到本地計算機上的特定文件夾中......但我們不希望這樣,我們希望將填充的PDF文件保存到用戶選擇的文件夾中。我們不希望這些應用程序發佈後將這些文件保留在服務器上。保存PDF格式的對話框提示而不是保存到硬編碼路徑

下面的代碼創建了硬編碼的文件路徑,它被填充,但底部提示用戶保存文件的部分,創建一個我們想要的文件名格式的pdf,但文件總是20k,不會打開。我怎樣才能改變下面的代碼,而不是真的在服務器上創建文件,而是在他們選擇保存時將其創建到用戶PC?

using (FileStream outfile = new FileStream(outputfile, FileMode.Create)) 
       { 
        PdfReader rdr = new PdfReader(pdftemplate); 
        PdfStamper stm = new PdfStamper(rdr, outfile); 
        AcroFields fields = stm.AcroFields; 

        foreach (var de in rdr.AcroFields.Fields) 
        {               
         if (de.Key == "Date") 
         { 
          fields.SetField("Date", dt.Rows[0]["Form Date"].ToString()); 
         } 
         if (de.Key == "Project Name") 
         { 
          fields.SetField("Project Name", dt.Rows[0]["Project Name"].ToString()); 
         } 
         if (de.Key == "Contract No") 
         { 
          fields.SetField("Contract No", dt.Rows[0]["Contract Number"].ToString()); 
         } 

        } 

        stm.Close(); 
        rdr.Close(); 

        Response.ContentType = "application/pdf"; 
        Response.AddHeader("content-disposition", "attachment; filename=" + newFile); 
        Response.Write(outfile); 
        Response.End(); 
       } 
+0

您可以嘗試將文件內容讀入一個byte []數組中,並用一個'MemoryStream'數據流包裝該數組。然後使用那個'MemoryStream'流來代替你現在使用的'FileStream'(所以填寫它並寫入'Response'對象)。您也可以嘗試在寫入「響應」流之前重置流以恢復其初始位置。 –

+0

因此,而不是使用FileStream使用MemoryStream? – user3508683

+0

是的,我不確定它是否能解決問題,但它可能有幫助。據我瞭解,您問了兩個問題:1.如何不覆蓋服務器上的模板PDF文件。 2.如何讓用戶正確下載更新的文件。它是否正確?使用'MemoryStream'應該有助於1.並且可以幫助2. –

回答

1

我覺得你的代碼的問題是,你正在使用filestream這是造成PDF格式保存到您的服務器。使用memorystream應該解決這個問題。嘗試這樣的事情,看看是否有幫助。

Using (MemoryStream ms = new MemoryStream()) 
{ 
    PdfReader rdr = new PdfReader(pdftemplate); 
    PdfStamper stm = new PdfStamper(rdr, ms); 
    AcroFields fields = stm.AcroFields; 

    foreach (var de in rdr.AcroFields.Fields) 
    { 
     if (de.Key == "Date") 
     { fields.SetField("Date", dt.Rows[0]["Form Date"].ToString()); } 

     if (de.Key == "Project Name") 
     { fields.SetField("Project Name", dt.Rows[0]["Project Name"].ToString()); } 

     if (de.Key == "Contract No") 
     { fields.SetField("Contract No", dt.Rows[0]["Contract Number"].ToString()); } 
    } 

    stm.Close(); 
    rdr.Close(); 

    Response.ContentType = "application/pdf"; 
    Response.AddHeader("content-disposition", "attachment; filename=MyFile.pdf"); 
    //To display pdf in the browser window instead of saving, change attachment to inline 
    Response.BinaryWrite(ms.ToArray()); 
    Response.End(); 
} 

通過使用與HTML頭一起MemoryStream,你應該得到一個提示保存的文件。