Как открыть файл PDF, который также является ресурсом проекта? - PullRequest
8 голосов
/ 23 декабря 2011

У меня есть файл PDF, который я импортировал в качестве ресурса в свой проект. Этот файл является справочным документом, поэтому я хочу иметь возможность включать его при каждом развертывании. Я хочу иметь возможность открыть этот файл одним нажатием кнопки.

Я установил действие по сборке "Embedd Resource". Так что теперь я хочу иметь возможность открыть его. Однако, когда я пытаюсь получить доступ к ресурсу - My.Resources.HelpFile - это байтовый массив. Как мне открыть его, если я знаю , что у конечного пользователя есть программа, подходящая для открытия PDF-документов?

Если я пропустил предыдущий вопрос, пожалуйста, укажите мне правильное направление. Я нашел несколько вопросов об открытии PDF в приложении, но мне все равно, открывается ли Adobe Reader отдельно.

Ответы [ 7 ]

15 голосов
/ 09 июня 2012

Проверьте это легко открыть 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);             
    }   
7 голосов
/ 23 декабря 2011

Создайте новый процесс:

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.

2 голосов
/ 19 июня 2017

"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");
    }
2 голосов
/ 23 декабря 2011

Если единственная точка PDF должна открываться программой чтения PDF, не встраивайте ее в качестве ресурса.Вместо этого сделайте, чтобы ваша установка скопировала это в разумное место (вы могли бы поместить это, где находится EXE), и запустить его оттуда.Нет смысла копировать его снова и снова.

1 голос
/ 23 декабря 2011
File.Create("temp path");
File.WriteAllBytes("temp path", Resource.PDFFile)
1 голос
/ 23 декабря 2011

Это должно помочь - я часто использую этот код для открытия различных исполняемых файлов, документов и т. Д., Которые я встроил в качестве ресурса.

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 голос
/ 23 декабря 2011

Вам необходимо преобразовать ресурс в формат, приемлемый для программы, которая должна использовать ваш файл.

Один из способов сделать это - записать содержимое ресурса в файл (временный файл), а затем запустить программу, указывающую его на файл.

Возможно ли передатьресурс напрямую в программу зависит от программы.Я не уверен, что это можно сделать с помощью Adobe Reader.

Чтобы записать содержимое ресурса в файл, вы можете создать экземпляр класса MemoryStream и передать свой байтовый массив егоконструктор

...