2011-12-22 186 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"); 
    }