2011-12-22 34 views
6

Tôi có tệp PDF mà tôi đã nhập dưới dạng tài nguyên vào dự án của mình. Tệp này là tài liệu trợ giúp nên tôi muốn có thể bao gồm nó với mọi triển khai. Tôi muốn có thể mở tệp này bằng cách nhấp vào nút.Cách mở tệp PDF cũng là tài nguyên dự án?

Tôi đã đặt hành động xây dựng thành "Tài nguyên nhúng". Vì vậy, bây giờ tôi muốn để có thể mở nó. Tuy nhiên, khi tôi thử truy cập tài nguyên - My.Resources.HelpFile - đó là một mảng byte. Làm cách nào để mở thông tin này nếu tôi biết rằng người dùng cuối có chương trình phù hợp để mở tài liệu PDF không?

Nếu tôi bỏ lỡ câu hỏi trước, vui lòng chỉ cho tôi đúng hướng. Tôi đã tìm thấy một số câu hỏi về cách mở một tệp PDF trong một ứng dụng, nhưng tôi không quan tâm nếu Adobe Reader mở riêng biệt.

Trả lời

5

Tạo một Process mới:

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

Để cho tiện làm việc, Visual Studio thiết Copy to Output Directory phải được thiết lập để Copy Always cho tập tin PDF.

+0

bất kỳ lý do nào cho phiếu giảm giá? Nó hoạt động cho tôi ... – Adam

+0

Tôi làm cách nào để truy cập vào tệp tài nguyên của mình? Tôi không biết người dùng sẽ cài đặt ứng dụng của tôi ở đâu vì vậy tôi không chắc chắn nơi tệp đó sẽ đến. Và xin lỗi, tôi đã downvoted vì ban đầu bạn chỉ cho tôi biết cách mở một quy trình Adobe Reader mới. –

+0

Các câu hỏi không phải là về khởi chạy trình đọc, mà là về việc cho nó tài nguyên – mfeingold

0

Bạn cần phải chuyển đổi tài nguyên thành định dạng có thể chấp nhận được cho chương trình được yêu cầu sử dụng tệp của bạn.

Một cách để làm điều này là viết nội dung của tài nguyên vào một tệp (tệp tạm thời) và sau đó khởi chạy chương trình trỏ nó vào tệp.

Cho dù có thể cấp nguồn trực tiếp vào chương trình hay không tùy thuộc vào chương trình. Tôi không chắc chắn nếu nó có thể được thực hiện với Adobe Reader.

Để viết nội dung tài nguyên vào một tập tin, bạn có thể tạo ra một thể hiện của lớp MemoryStream và vượt qua mảng byte của bạn để xây dựng nó

0

Điều này sẽ giúp - Tôi sử dụng mã này thường xuyên để mở khác nhau thực thi, tài liệu, vv ... mà tôi đã nhúng làm tài nguyên.

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' là null –

+0

Nó cần không gian tên - được chỉnh sửa mã ở trên và đính kèm ảnh chụp màn hình. Làm việc tốt bây giờ ... hy vọng nó sẽ giúp :) –

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

Nếu điểm duy nhất của PDF là được mở bằng một trình đọc PDF, đừng nhúng nó như một nguồn tài nguyên. Thay vào đó, hãy cài đặt bản sao của bạn vào một nơi hợp lý (bạn có thể đặt nó ở vị trí đặt EXE) và chạy nó từ đó. Không có điểm sao chép nó hơn và hơn nữa.

+0

Điều gì sẽ xảy ra nếu tập tin trợ giúp liên tục được cập nhật? –

+0

Sau đó, bạn chỉ cần đặt một liên kết đến nó trong ứng dụng và mở nó từ máy chủ mỗi khi bạn muốn người dùng đọc nó. – zmbq

12

Kiểm tra điều này dễ dàng để mở tệp pdf từ tài nguyên.

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 Ngạc nhiên không ai nhận xét về điều này. Tôi làm điều này mọi lúc với các tệp PDF được nhúng để tôi vẫn có thể có một tệp thực thi duy nhất. –

+0

Làm việc cho tôi. Khi phân phối UserControls mà không cần trình cài đặt sao chép các tệp trợ giúp vào ổ đĩa cục bộ, đây là một giải pháp hữu ích. Thay đổi duy nhất tôi đã thực hiện là sử dụng phương thức Environment.GetEnvironmentVariable() để lấy các chi tiết của thư mục TEMP cho người dùng hiện tại. – IsolatedStorage

+1

Tôi cảm thấy như đây là câu trả lời đúng cho câu hỏi này. Tuy nhiên, tôi sẽ thêm rằng thay vì đường dẫn 'openPDFFile' đó, hãy sử dụng đường dẫn hệ thống như 'String openPDFFile = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) + @" \ fileName.pdf "' ví dụ –

1

"ReferenceGuide" là tên của tệp pdf mà tôi đã thêm vào tài nguyên của mình.

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"); 
    } 
Các vấn đề liên quan