C# 如何打开同时也是项目资源的PDF文件?

C# 如何打开同时也是项目资源的PDF文件?,c#,.net,visual-studio-2008,pdf,embedded-resource,C#,.net,Visual Studio 2008,Pdf,Embedded Resource,我有一个PDF文件,作为资源导入到我的项目中。该文件是一个帮助文档,因此我希望能够在每次部署中包含它。我想能够打开这个文件在点击一个按钮 我已将构建操作设置为“嵌入资源”。所以现在我想打开它。但是,当我尝试访问资源时-My.Resources.HelpFile,它是一个字节数组。如果我知道最终用户有一个适合打开PDF文档的程序,我将如何打开它 如果我遗漏了前面的问题,请给我指出正确的方向。我发现了几个关于在应用程序中打开PDF的问题,但我不在乎Adobe Reader是否单独打开。创建新流程:

我有一个PDF文件,作为资源导入到我的项目中。该文件是一个帮助文档,因此我希望能够在每次部署中包含它。我想能够打开这个文件在点击一个按钮

我已将构建操作设置为“嵌入资源”。所以现在我想打开它。但是,当我尝试访问资源时-
My.Resources.HelpFile
,它是一个字节数组。如果我知道最终用户有一个适合打开PDF文档的程序,我将如何打开它

如果我遗漏了前面的问题,请给我指出正确的方向。我发现了几个关于在应用程序中打开PDF的问题,但我不在乎Adobe Reader是否单独打开。

创建新流程:

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

为了使此功能正常工作,必须将PDF文件的Visual Studio设置“复制到输出目录”设置为“始终复制”。

您需要将资源转换为可接受的格式,以便程序使用您的文件

一种方法是将资源的内容写入一个文件(临时文件),然后启动指向该文件的程序

是否可以将资源直接输入程序取决于程序。我不确定是否可以用AdobeReader完成


要将资源内容写入文件,您可以创建类的实例并将字节数组传递给其构造函数,这应该会有所帮助-我经常使用此代码打开各种可执行文件、文档等。。。我将其作为资源嵌入

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

如果PDF的唯一一点是由PDF阅读器打开,不要将其作为资源嵌入。相反,让您的安装程序将其复制到一个合理的位置(您可以将其放在EXE所在的位置),然后从那里运行它。一遍又一遍地复制它是没有意义的。

从资源中查看此易于打开的pdf文件

private void btnHelp_Click(object sender, EventArgs e)
    {            
        String openPDFFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\HelpDoc.pdf";//PDF DOc name
        System.IO.File.WriteAllBytes(openPDFFile, global::ProjectName.Properties.Resources.resourcePdfFileName);//the resource automatically creates            
        System.Diagnostics.Process.Start(openPDFFile);             
    }   
“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");
    }

我将如何从此访问我的资源文件?我不知道用户将在哪里安装我的应用程序,所以我不确定文件将在哪里。很抱歉,我投了反对票,因为您最初只向我展示了如何打开一个新的Adobe Reader进程。问题不是关于启动Reader,而是关于向它提供resource@mfeingold@Adam我所做的是:将PDF添加到VS2010项目中,将
构建操作
设置为
嵌入式资源
,将
复制到输出目录
设置为
始终复制
。。。最后,我得到了一个可以用上面的代码轻松打开的文档。因此,我认为它很好地解决了这个问题,除非它要求PDF不能作为程序目录中的文件提供。我仍然得到一个“打开此文档时出错。无法找到此文件”。我做了你刚才提到的一切。使用
Arguments=Path.Combine(Directory.GetCurrentDirectory(),“你的文件名”)
它需要名称空间-编辑上面的代码并附上一个屏幕截图。现在可以正常工作了…希望有帮助:)然后你只需在应用程序中添加一个指向它的链接,并在每次希望用户阅读时从服务器上打开它。+1惊讶于没有人对此发表评论。我一直在用嵌入式PDF做这个,这样我仍然可以有一个可执行文件。对我来说也很有用。在不需要安装程序将帮助文件复制到本地驱动器的地方分发UserControls时,这是一个有用的解决方案。我所做的唯一更改是使用Environment.GetEnvironmentVariable()方法获取当前用户临时文件夹的详细信息。我觉得这是这个问题的正确答案。但是,我要补充的是,不要使用
openPDFFile
路径,而是使用系统路径,例如
String openPDFFile=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)+@“\fileName.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");
    }
//create a temporal file
string file = Path.GetTempFileName() + ".pdf";
//write to file
File.WriteAllBytes(file, Properties.Resources.PDF_DOCUMENT);
//open with default viewer
System.Diagnostics.Process.Start(file);