【问题标题】:How to open a PDF file that is also a project resource?如何打开也是项目资源的 PDF 文件?
【发布时间】:2012-01-26 10:12:15
【问题描述】:

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

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

如果我错过了上一个问题,请指出正确的方向。我发现了几个关于在应用程序打开 PDF 的问题,但我不在乎 Adob​​e Reader 是否单独打开。

【问题讨论】:

    标签: c# .net visual-studio-2008 pdf embedded-resource


    【解决方案1】:
    //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);
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • 我认为这段代码完美地回答了这个问题,不需要额外的上下文
    【解决方案2】:

    看看这个很容易从资源中打开 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);             
        }   
    

    【讨论】:

    • +1 很惊讶没有人对此发表评论。我一直使用嵌入式 PDF 这样做,这样我仍然可以只有一个可执行文件。
    • 也为我工作。在不需要安装程序将帮助文件复制到本地驱动器的情况下分发用户控件时,这是一个有用的解决方案。我所做的唯一更改是使用 Environment.GetEnvironmentVariable() 方法来获取当前用户的 TEMP 文件夹的详细信息。
    • 我觉得这是这个问题的正确答案。但是,我要补充一点,而不是 openPDFFile path,而是使用像 String openPDFFile = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\fileName.pdf" 这样的系统路径
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这应该会有所帮助 - 我经常使用此代码打开我作为资源嵌入的各种可执行文件、文档等。

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

      【讨论】:

      • 它需要命名空间 - 编辑上面的代码并附上截图。现在工作正常......希望它有所帮助:)
      【解决方案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 设置为 PDF 文件的 Copy Always

      【讨论】:

      • 如何访问我的资源文件?我不知道用户将在哪里安装我的应用程序,所以我不确定文件将在哪里。抱歉,我投了反对票,因为您最初只是向我展示了如何打开一个新的 Adob​​e Reader 进程。
      • 问题不是要启动阅读器,而是要为它提供资源
      • @mfeingold 和 @Adam 这是我所做的:将 PDF 添加到 VS2010 项目中,将 Build Action 设置为 embedded resource,将 Copy to Output Directory 设置为 Copy Always ...我最终得到一个我可以使用上面的代码轻松打开文档。所以我认为它很好地解决了这个问题,除非要求 PDF 可能可作为程序目录中的文件使用。
      • 我仍然收到“打开此文档时出错。找不到此文件”。我做了你刚才提到的一切。
      • 使用Arguments = Path.Combine(Directory.GetCurrentDirectory(), "YOUR FILE NAME")
      【解决方案6】:

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

      【讨论】:

      • 然后你只需在应用程序中放一个指向它的链接,每次你希望用户阅读它时从服务器打开它。
      【解决方案7】:

      您需要将资源转换为应该使用您文件的程序可接受的格式。

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

      是否可以将资源直接馈入程序取决于程序。我不确定是否可以使用 Adob​​e Reader。

      要将资源内容写入文件,您可以创建 MemoryStream 类的实例并将字节数组传递给其构造函数

      【讨论】:

        【解决方案8】:
        File.Create("temp path");
        File.WriteAllBytes("temp path", Resource.PDFFile)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-13
          • 2013-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-17
          相关资源
          最近更新 更多