2011-10-13 58 views
2

我有一個需要生成一個PDF文檔的按鈕點擊使用可視化Web部分 - 共享點2010年。 我使用的開源庫http://www.itextpdf.com/一樣。我能夠使用項目類型作爲Windowns應用程序執行下面的代碼。但是,當我想要按一下按鈕時,我正在接收c:\ windows \ system32 \ inetsrv \ Test.pdf'被拒絕。錯誤。c: windows system32 inetsrv Test.pdf被拒絕

下面是我使用

public static void Main(string[] args) --Console Application 
    { 
     Console.WriteLine("PDF demo"); 
     Document myDoc = new Document(PageSize.A4.Rotate()); 
     try 
     { 
      PdfWriter.GetInstance(myDoc, new FileStream("Salman.pdf", FileMode.Create)); 
      myDoc.Open(); 
      myDoc.Add(new Paragraph("First pdf File made by Salman using Itext")); 
     } 
     catch (DocumentException ex) 
     { 
      Console.Error.WriteLine(ex.Message); 
     } 
     myDoc.Close(); 
    } 
} 

代碼,但我希望做同樣的一個按鈕單擊事件。

protected void pdfGenerator_OnClick(object sender, EventArgs e) 
    { 
     Document myDoc = new Document(PageSize.A4.Rotate()); 
     try 
     { 
      PdfWriter.GetInstance(myDoc, new FileStream("Salman.pdf", FileMode.Create));---I get an error here 
      myDoc.Open(); 
      myDoc.Add(new Paragraph("First pdf File made by Salman using Itext")); 
     } 
     catch (DocumentException ex) 
     { 
      Console.Error.WriteLine(ex.Message); 
     } 
     myDoc.Close(); 
    } 
} 

請幫助我,我不明白錯誤的原因。我第一次嘗試它。

回答

3

問題是您正試圖在您無權訪問的目錄中創建PDF。這是因爲你沒有指定保存路徑的目錄;這會導致它在與當前工作目錄相同的位置默認。在很多情況下,比如ASP.NET;默認值與過程的位置相同。對於ASP.NET,過程爲w3wp.exe,並位於c:\ windows \ system32 \ inetsrv中。 w3wp將作爲(Network Service或AppPoolIdentity)運行的大多數身份無法訪問該目錄。實際上,只有系統管理員才能做到。

您需要保存到其他地方,這一進程具有寫權限到這裏:

PdfWriter.GetInstance(myDoc, new FileStream("Janaki.pdf", FileMode.Create)) 

應該是這樣的:

PdfWriter.GetInstance(myDoc, new FileStream(@"C:\directoryIcanWriteTo\Janaki.pdf", FileMode.Create)) 

如果您希望將其保存在同一個地方該網站,您將使用HttpContext.Current.Server.MapPath

PdfWriter.GetInstance(myDoc, new FileStream(HttpContext.Current.Server.MapPath("~/Janaki.pdf", FileMode.Create)) 

無論如何,標識如果沒有它們,y仍然需要寫入目錄的權限。但是你絕對不應該把它們放在inetsrv中。

+0

或'Path.Combine(DIRECTORYICANWRITETO,@「Janaki.pdf」)',如果'DIRECTORYICANWRITETO'是一個變量。 – Brian

+0

請注意,您還可以提升權限,以便當前用戶可以使用RunWithElevatedPrivileges方法訪問該目錄http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx – int32

+0

@ AndreasScharf是的,這是一種可能性 - 但是ASP.NET應用程序應該確實不會寫入系統目錄。爲了達到這個目的,這意味着你必須提升給有管理權限的人,完全違反[最小特權原則](http://en.wikipedia.org/wiki/Principle_of_least_privilege) – vcsjones

0

只要不使用需要在服務器上寫入權限的「FileStream」。將其替換爲MemoryStream,然後在用戶的瀏覽器上刷新其內容。

相關問題