2011-12-22 39 views
6

我有一個PDF文件,作爲資源導入到我的項目中。該文件是一個幫助文檔,所以我希望能夠將其包含在每個部署中。我希望能夠點擊一個按鈕打開這個文件。如何打開也是項目資源的PDF文件?

我已經設置了構建行動「使嵌入的資源」。所以現在我想打開它。但是,當我嘗試訪問資源時 - My.Resources.HelpFile - 它是一個字節數組。如果我知道最終用戶有一個適合打開PDF文檔的程序,我該如何去打開它?

如果我錯過了前一個問題,請點我朝着正確的方向。我發現了幾個關於在應用程序中打開PDF 的問題,但我不在乎Adobe Reader是否單獨打開。

回答

5

創建新的進程:

string path = Path.Combine(Directory.GetCurrentDirectory(), "PDF-FILE.pdf"); 
Process P = new Process { 
    StartInfo = {FileName = "AcroRd32.exe", Arguments = path} 
}; 
P.Start(); 

爲了這個工作,在Visual Studio設置Copy to Output Directory必須被設置爲Copy Always的PDF文件。

+0

任何理由downvote?它適用於我... – Adam 2011-12-22 20:48:47

+0

我將如何訪問我的資源文件?我不知道用戶在哪裏安裝我的應用程序,所以我不確定文件將在哪裏。抱歉,我因爲最初只向我展示瞭如何打開一個新的Adobe Reader進程而降低了評價。 – 2011-12-22 20:49:08

+0

這些問題不是關於啓動讀者,而是關於爲其提供資源 – mfeingold 2011-12-22 20:51:45

0

您需要將資源轉換成格式應該消耗你的文件的程序可以接受的。這樣做的

一種方式是寫的資源的一個文件中的內容(臨時文件),然後啓動它指向該文件的程序。

是否有可能直接供給資源到程序取決於程序。我不確定是否可以使用Adobe Reader完成。

要寫入的資源內容到一個文件,你可以創建MemoryStream類的實例,並通過您的字節數組給它的構造

0

這應該可以幫助 - 我使用此代碼經常打開各種可執行文件,文件等...我已經將其作爲資源嵌入。

private void button1_Click(object sender, EventArgs e) 
    { 
    string openPDFfile = @"c:\temp\pdfName.pdf"; 
    ExtractResource("WindowsFormsApplication1.pdfName.pdf", openPDFfile); 
    Process.Start(openPDFfile); 
    } 

    void ExtractResource(string resource, string path) 
      { 
       Stream stream = GetType().Assembly.GetManifestResourceStream(resource); 
       byte[] bytes = new byte[(int)stream.Length]; 
       stream.Read(bytes, 0, bytes.Length); 
       File.WriteAllBytes(path, bytes); 
      } 

enter image description here

+1

'stream'爲null – 2011-12-22 21:43:24

+0

它需要命名空間 - 編輯上面的代碼並附上截圖。現在工作正常...希望它可以幫助:) – 2011-12-22 22:06:38

0
File.Create("temp path"); 
File.WriteAllBytes("temp path", Resource.PDFFile) 
1

如果PDF的唯一的一點是要通過一個PDF閱讀器打開,也不要將它作爲一種資源。相反,將你的安裝拷貝到一個合理的地方(你可以把它放在EXE所在的位置),然後從那裏運行它。毫無意義地一遍又一遍地複製它。

+0

如果幫助文件不斷更新怎麼辦? – 2011-12-22 21:40:13

+0

然後,您只需在應用程序中放置一個鏈接,並在每次希望用戶閱讀時從服務器打開它。 – zmbq 2011-12-23 07:21:02

12

檢查此容易從資源打開pdf文件。

private void btnHelp_Click(object sender, EventArgs e) 
    {    
     String openPDFFile = @"c:\temp\pdfName.pdf"; 
     System.IO.File.WriteAllBytes(openPDFFile, global::ProjectName.Properties.Resources.resourcePdfFileName);    
     System.Diagnostics.Process.Start(openPDFFile);    
    } 
+0

+1驚訝沒有人評論這一點。我一直使用嵌入式PDF來做這件事,這樣我仍然可以擁有一個可執行文件。 – 2012-09-10 14:44:03

+0

也爲我工作。在分發UserControl時,無需安裝程序將幫助文件複製到本地驅動器,這是一個有用的解決方案。我做的唯一更改是使用Environment.GetEnvironmentVariable()方法獲取當前用戶的TEMP文件夾的詳細信息。 – IsolatedStorage 2015-03-24 05:09:24

+1

我覺得這是這個問題的正確答案。 然而,我會添加,而不是'openPDFFile'路徑,使用系統路徑例如'字符串openPDFFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)+ @「\ fileName.pdf」'例如 – 2017-03-07 11:09:27

1

「ReferenceGuide」是我添加到我的資源中的pdf文件的名稱。

using System.IO; 
using System.Diagnostics; 

    private void OpenPdfButtonClick(object sender, EventArgs e) 
    { 
     //Convert The resource Data into Byte[] 
     byte[] PDF = Properties.Resources.ReferenceGuide; 

     MemoryStream ms = new MemoryStream(PDF); 

     //Create PDF File From Binary of resources folders helpFile.pdf 
     FileStream f = new FileStream("helpFile.pdf", FileMode.OpenOrCreate); 

     //Write Bytes into Our Created helpFile.pdf 
     ms.WriteTo(f); 
     f.Close(); 
     ms.Close(); 

     // Finally Show the Created PDF from resources 
     Process.Start("helpFile.pdf"); 
    }