Отображение PDF-файла из Winform - PullRequest
23 голосов
/ 08 февраля 2010

Я просто создаю простой калькулятор на C # (форма windows)

Я создал «Справку пользователя», которая представляет собой PDF-файл, и мне нужно отобразить этот PDF-файл, если пользователь нажимает кнопку «Справка» в WinForm. Если предположить, что Adobe Reader предварительно установлен на компьютере пользователя ....

Как открыть PDF-файл по нажатию кнопки в WinForm?

Я не планирую размещать этот PDF-файл на жестком диске пользователя. Это означает, что я должен вставить этот PDF-файл в калькулятор (winForm) и отображать его при нажатии кнопки.

Пожалуйста, ознакомьте меня с рекомендациями по отображению встроенного файла в winForm.

Ответы [ 11 ]

22 голосов
/ 08 февраля 2010

Вы можете сослаться на элемент управления Adobe Reader ActiveX и связать его с вашим приложением.

Просто добавьте AcroPDF.PDF.1 на панель инструментов на вкладке COM-компоненты (щелкните правой кнопкой мыши на панели инструментов и выберите Choose Items...), затем перетащите экземпляр на Winform, чтобы дизайнер создал код для вас. В качестве альтернативы, после добавления необходимой ссылки вы можете использовать следующий код:

AxAcroPDFLib.AxAcroPDF pdf = new AxAcroPDFLib.AxAcroPDF();
pdf.Dock = System.Windows.Forms.DockStyle.Fill;
pdf.Enabled = true;
pdf.Location = new System.Drawing.Point(0, 0);
pdf.Name = "pdfReader";
pdf.OcxState = ((System.Windows.Forms.AxHost.State)(new System.ComponentModel.ComponentResourceManager(typeof(ViewerWindow)).GetObject("pdfReader.OcxState")));
pdf.TabIndex = 1;

// Add pdf viewer to current form        
this.Controls.Add(pdf);

pdf.LoadFile(@"C:\MyPDF.pdf");
pdf.setView("Fit");
pdf.Visible = true;
11 голосов
/ 08 февраля 2010

Вы можете использовать элемент управления WebBrowser и позволить IE загрузить программу чтения PDF для вас, если она установлена ​​на компьютере.

Однако в последний раз, когда я пытался это сделать, мне сначала пришлось записать файл PDF на диск, чтобы я мог указать на него элемент управления WebBrowser.

7 голосов
/ 14 декабря 2015

Если вы хотите отобразить pdf внутри своего приложения, элемент управления WebBrowser, вероятно, предпочтительнее элемента управления Adobe Reader, поскольку он будет очень плавно открывать файл в PDF Reader или в любом другом IE, используемом по умолчанию для открытия PDF-файлов. Вы просто добавляете элемент управления WebBrowser к существующей или новой форме и переходите к файлу PDF.

Никогда не предполагайте, что у пользователя на компьютерах установлены Adobe или любые другие элементы управления или библиотеки сторонних производителей, всегда упаковывайте их вместе с исполняемым файлом, иначе у вас могут возникнуть проблемы.

Элемент управления Adobe Reader, очевидно, не так хорошо интегрируется с .NET как встроенный компонент Windows. Как правило, я всегда поддерживаю использование встроенных элементов управления .Net для сторонних поставщиков. Что касается встраивания файла в фактический исполняемый файл; этого не произойдет, пока Microsoft не решит, что любой старый PDF-файл может быть добавлен в CLS и скомпилирован в MSIL. Когда вы разрабатываете любое приложение в .NET, у вас есть код, который можно скомпилировать в промежуточный MSIL для преобразования во время выполнения CLR в собственный код и выполнения в ОС.

WebBrowser1.Navigate("SomePDF.pdf");
7 голосов
/ 03 сентября 2010

В коде Google есть проект для просмотра C # pdf. http://code.google.com/p/pdfviewer-win32/ есть программа просмотра и библиотека, которую он использует, которая использует mupdf и xpdf для рендеринга PDF-документов в вашей программе winforms В настоящее время я разрабатываю библиотеку пользовательских элементов управления, чтобы люди могли использовать их для просмотра PDF-файлов. это работает довольно хорошо.

6 голосов
/ 09 февраля 2010

Если на вашем компьютере установлен Adobe Reader (или любой другой PDF-ридер), вы можете использовать:

System.Diagnostics.Process.Start(
       "My-PDF-file.pdf");

Надеюсь, это поможет.

Примечание. Очевидно, что произойдет сбой, если у пользователя не установлено ни одного приложения для чтения PDF.

6 голосов
/ 08 февраля 2010

Я бы включил его в папку с моей программой, добавил ссылку в папку «Пуск», чтобы разрешить прямой доступ (без запуска моего инструмента) и просто при каком-либо событии щелчка System.Diagnostics.Process.Start(@".\Manual.pdf");

Обновление

Хорошо, теперь мы подошли к совершенно новому вопросу: как встроить файл в мое приложение и запустить его?

На этот вопрос вы уже найдете несколько ответов, но вот короткая версия:

  1. Щелкните правой кнопкой мыши свой проект и выберите Добавить - Существующий элемент
  2. Выберите ваш файл ( не делайте двойной щелчок по нему )
    • Нажмите на маленькую стрелку рядом с кнопкой Добавить и выберите Добавить как ссылку
  3. Двойной щелчок по Свойствам - Resources.resx
  4. Нажмите маленькую стрелку рядом с Добавить ресурс и выберите Добавить существующий файл
  5. Выберите тот же файл снова в открытом диалоге
  6. Теперь вы можете получить доступ к файлу в вашем коде как byte[] с Properties.Resources.NameOfResource

Этими шагами вы ссылаетесь на свой файл, где бы он ни находился в вашей структуре. Если вам это нравится, копия вашего pdf-файла будет помещена в подпапку Resources вашего проекта, просто пропустите пункты один и два в приведенном выше списке.

Чтобы открыть PDF-файл, вам нужно записать байт [] на диск (возможно, с Path.GetTempFileName()) и запустить его с помощью Adobe Reader. (Не забудьте удалить файл после использования)

5 голосов
/ 08 февраля 2010

Я бы предложил преобразовать ваш PDF-файл в файл справки Microsoft, чтобы вам не нужно было устанавливать Adobe Reader (он глючит и имеет слишком много проблем с безопасностью). Вы не можете ожидать, что пользователи будут иметь это.

В ответ на комментарий стартера:

Да, вам нужно создать файл справки в виде документа HTML, а не в формате PDF. Нет простого способа конвертировать pdf в HTML.

4 голосов
/ 08 февраля 2010

Возможно, вы сможете встроить Adobe Reader в вашу форму в качестве компонента ActiveX. Но это означает, что вам нужно убедиться, что Reader установлен на клиентском компьютере, чтобы это работало.

В случае, если он не должен быть строго внедрен, вы можете просто запустить файл PDF и позволить любому пользователю, открывающему программу, открыть его.

3 голосов
/ 09 сентября 2017

Вывод встроенного файла не должен быть проблемой вообще. Это не зависит от того, что это формат .pdf, и вы можете просто найти там отдельное решение.

Для отображения, если вы не знаете, что установлен Acrobat или аналогичный (ну, даже Edge может открывать эти файлы в настоящее время), или если вы хотите отобразить файл, встроенный в приложение WinForms, есть

Решение Codeproject

https://www.codeproject.com/Articles/37458/PDF-Viewer-Control-Without-Acrobat-Reader-Installe

написано на VB с использованием множества (частично коммерческих, если ваше решение коммерческое) библиотек.

PdfiumViewer

https://github.com/pvginkel/PdfiumViewer

великолепен и также доступен через NuGet.

The PdfiumViewer library primarily consists out of three components:
•The  PdfViewer  control. This control provides a host for the  PdfRenderer  control and has a default toolbar with limited functionality;
•The  PdfRenderer  control. This control implements the raw PDF renderer. This control displays a PDF document, provides zooming and scrolling functionality and exposes methods to perform more advanced actions;
•The  PdfDocument  class provides access to the PDF document and wraps the Pdfium library.

Это универсальное решение для отображения и поставляется с более дружественной лицензией Apache 2.0.

редактировать, добавлен пример кода , для вашего удобства :) Я включил следующее

data = File.ReadAllBytes(@"C:\temp\abc.pdf");
PdfiumViewer.PdfDocument doc;
using (Stream stream = new MemoryStream(data))
{
    doc = PdfiumViewer.PdfDocument.Load(stream);
    var viewer = new PdfiumViewer.PdfViewer();
    viewer.Document = doc;
    var form = new System.Windows.Forms.Form();
    form.Size = new Size(600, 800);
    viewer.Dock = System.Windows.Forms.DockStyle.Fill;
    form.Controls.Add(viewer);
    form.ShowDialog();
}

Это создает форму на лету, конечно, вы также можете использовать конструктор.

3 голосов
/ 12 апреля 2017

Как открыть файл PDF с относительным путем

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

Прежде всего включите следующую библиотеку:

using System.IO;

Затем используйте Кнопка , picturebox или независимо для создания ClickEvent и использования следующего фрагмента кода:

    private void pictureBox2_Click(object sender, EventArgs e)
    {
        //get current folderpath of the .exe
        string ProgramPath = AppDomain.CurrentDomain.BaseDirectory;
        //jump back relative to the .exe-Path to the Resources Path
        string FileName = string.Format("{0}Resources\\Master_Thesis_Expose.pdf", Path.GetFullPath(Path.Combine(ProgramPath, @"..\..\")));

        //Open PDF
        System.Diagnostics.Process.Start(@"" + FileName + "");

    }

| Большой палец вверх |

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...