Отображение PDF в приложении WPF не работает - WebBrowser или Adobe Control - PullRequest
4 голосов
/ 13 мая 2011

Мне нужно отобразить PDF в приложении WPF.Из всего того, что я читал в Интернете, кажется, что [единственные?] Способы отображения PDF в приложении WPF - с помощью элементов управления Adobe или элемента управления WebBrowser.Я пытался использовать элементы управления Adobe, однако мне не удалось добавить элемент управления Reader, потому что по какой-то причине я не могу найти его как нечто, что я могу добавить в свою панель инструментов (даже после добавления необходимой ссылки).Я использую Windows 7 (64-разрядную версию), VS2010, .NET 4.0, и у меня установлены Adobe Acrobat 7.0 Professional и Adobe Acrobat 9 Pro Extended, если это как-то связано с этим.Так или иначе, я решил попробовать это в элементе управления WebBrowser, размещенном в WindowsFormsHost.У меня есть XAML:

<WindowsFormsHost x:Name="FormsHost" Visibility="Visible" Grid.Column="1" Margin="7,0,0,0">
<WF:WebBrowser x:Name="WebBrowser" Dock="Fill" IsWebBrowserContextMenuEnabled="False" ScriptErrorsSuppressed="True" WebBrowserShortcutsEnabled="False" Margin="7,0,0,0" />
</WindowsFormsHost>

, а затем в коде C #:

WebBrowser.Navigate(new System.Uri(FileName));

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

WebBrowser.Url = new System.Uri(FileName);

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

У кого-нибудь есть идеи относительно того, почему это не работает?Или, может быть, почему у меня, кажется, нет элемента управления Reader в качестве опции?На данный момент, любое решение будет в порядке, просто ни один из них не работает!

Спасибо!

Ответы [ 4 ]

7 голосов
/ 28 декабря 2012

Вот что я сделал ...

ОСНОВНОЕ ОКНО XAML

 <Window x:Class="PDFView.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="PDFView">
        <Grid>
            <WebBrowser x:Name="Browser" />
        </Grid>
    </Window>

КОД ОСНОВНОГО ОКНА ЗА *

using System.IO;
using System.Net;
using System.Windows;
using System.Windows.Navigation;

namespace PDFView {
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private const string hostUri = "http://localhost:8088/PsuedoWebHost/";

        private HttpListener _httpListener;

        public MainWindow() {
            InitializeComponent();

            this.Loaded += OnLoaded;
        }

        /// <summary>
        /// Loads the specified PDF in the WebBrowser control
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="routedEventArgs"></param>
        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            // Get the PDF from the 'database'
            byte[] pdfBytes = GetPdfData();

            // Create a PDF server that serves the PDF to a browser
            CreatePdfServer(pdfBytes);

            // Cleanup after the browser finishes navigating
            Browser.Navigated += BrowserOnNavigated;
            Browser.Navigate(hostUri);
        }

        /// <summary>
        /// Retrieve a byte array from a 'database record'
        /// </summary>
        /// <returns></returns>
        private byte[] GetPdfData() {
            // TODO: Replace this code with data access code
            // TODO: Pick a file from the file system for this demo.
            string path = @"c:\Users\Me\Documents\MyPDFDocument.pdf"; 
            byte[] pdfBytes = File.ReadAllBytes(path);

            // Return the raw data
            return pdfBytes;
        }

        /// <summary>
        /// Creates an HTTP server that will return the PDF  
        /// </summary>
        /// <param name="pdfBytes"></param>
        private void CreatePdfServer(byte[] pdfBytes) {
            _httpListener = new HttpListener();
            _httpListener.Prefixes.Add(hostUri);
            _httpListener.Start();
            _httpListener.BeginGetContext((ar) => {
                                                  HttpListenerContext context = _httpListener.EndGetContext(ar);

                                                  // Obtain a response object.
                                                  HttpListenerResponse response = context.Response;
                                                  response.StatusCode = (int)HttpStatusCode.OK;
                                                  response.ContentType = "application/pdf";

                                                  // Construct a response.
                                                  if (pdfBytes != null) {
                                                      response.ContentLength64 = pdfBytes.Length;

                                                      // Get a response stream and write the PDF to it.
                                                      Stream oStream = response.OutputStream;
                                                      oStream.Write(pdfBytes, 0, pdfBytes.Length);
                                                      oStream.Flush();
                                                  }

                                                  response.Close();
                                              }, null);

        }

        /// <summary>
        /// Stops the http listener after the browser has finished loading the document
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="navigationEventArgs"></param>
        private void BrowserOnNavigated(object sender, NavigationEventArgs navigationEventArgs)
        {
            _httpListener.Stop();
            Browser.Navigated -= BrowserOnNavigated;
        }

    }
}
0 голосов
/ 18 ноября 2015

Поздний ответ, но это может помочь другим людям.
Я работаю на машине с Windows 8.1 x64.
Моей задачей было дать пользователям возможность просматривать PDF-документы на устройстве (планшет с ОС Windows). После долгих исследований я не смог найти ни одного приемлемого решения, или то, что я должен сказать, используя WindowsFormsHost, просто кажется грязным!

Я использовал элемент управления WebBrowser следующим образом:

<WebBrowser Source="pack://siteoforigin:,,,/path/to/your/file.html"/>

Примечание: pack://siteoforigin: относится к местоположению, когда ваше приложение работает. Поэтому убедитесь, что ваши файлы .html установлены на Content и Copy Always.
Теперь, когда ваш html настроен, вам нужно либо скачать, либо просто скопировать и вставить следующий .js код:

/*
PDFObject v1.2.20111123
https://github.com/pipwerks/PDFObject
Copyright (c) Philip Hutchison
MIT-style license: http://pipwerks.mit-license.org/
*/
/*jslint browser: true, sloppy: true, white: true, plusplus: true */
/*global ActiveXObject, window */
var PDFObject = function (obj) {

if (!obj || !obj.url) { return false; }

var pdfobjectversion = "1.2",
    //Set reasonable defaults
    id = obj.id || false,
    width = obj.width || "100%",
    height = obj.height || "100%",
    pdfOpenParams = obj.pdfOpenParams,
    url,
    pluginTypeFound,

    //declare functions
    createAXO,
    hasReaderActiveX,
    hasReader,
    hasGeneric,
    pluginFound,
    setCssForFullWindowPdf,
    buildQueryString,
    get,
    embed;


/* ----------------------------------------------------
   Supporting functions
   ---------------------------------------------------- */

createAXO = function (type) {
    var ax;
    try {
        ax = new ActiveXObject(type);
    } catch (e) {
        //ensure ax remains null
        ax = null;
    }
    return ax;
};

//Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer
hasReaderActiveX = function () {

    var axObj = null;

    if (window.ActiveXObject) {

        axObj = createAXO("AcroPDF.PDF");

        //If "AcroPDF.PDF" didn't work, try "PDF.PdfCtrl"
        if (!axObj) { axObj = createAXO("PDF.PdfCtrl"); }

        //If either "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true
        if (axObj !== null) { return true; }

    }

    //If you got to this point, there's no ActiveXObject for PDFs
    return false;

};



//Tests specifically for Adobe Reader (aka Adobe Acrobat) in non-IE browsers
hasReader = function () {

    var i,
        n = navigator.plugins,
        count = n.length,
        regx = /Adobe Reader|Adobe PDF|Acrobat/gi;

    for (i = 0; i < count; i++) {
        if (regx.test(n[i].name)) {
            return true;
        }
    }

    return false;

};


//Detects unbranded PDF support
hasGeneric = function () {
    var plugin = navigator.mimeTypes["application/pdf"];
    return (plugin && plugin.enabledPlugin);
};


//Determines what kind of PDF support is available: Adobe or generic
pluginFound = function () {

    var type = null;

    if (hasReader() || hasReaderActiveX()) {

        type = "Adobe";

    } else if (hasGeneric()) {

        type = "generic";

    }

    return type;

};


//If setting PDF to fill page, need to handle some CSS first
setCssForFullWindowPdf = function () {

    var html = document.getElementsByTagName("html"),
        html_style,
        body_style;

    if (!html) { return false; }

    html_style = html[0].style;
    body_style = document.body.style;

    html_style.height = "100%";
    html_style.overflow = "hidden";
    body_style.margin = "0";
    body_style.padding = "0";
    body_style.height = "100%";
    body_style.overflow = "hidden";

};


//Creating a querystring for using PDF Open parameters when embedding PDF
buildQueryString = function (pdfParams) {

    var string = "",
        prop;

    if (!pdfParams) { return string; }

    for (prop in pdfParams) {

        if (pdfParams.hasOwnProperty(prop)) {

            string += prop + "=";

            if (prop === "search") {

                string += encodeURI(pdfParams[prop]);

            } else {

                string += pdfParams[prop];

            }

            string += "&";

        }

    }

    //Remove last ampersand
    return string.slice(0, string.length - 1);

};


//Simple function for returning values from PDFObject
get = function (prop) {

    var value = null;

    switch (prop) {
        case "url": value = url; break;
        case "id": value = id; break;
        case "width": value = width; break;
        case "height": value = height; break;
        case "pdfOpenParams": value = pdfOpenParams; break;
        case "pluginTypeFound": value = pluginTypeFound; break;
        case "pdfobjectversion": value = pdfobjectversion; break;
    }

    return value;

};


/* ----------------------------------------------------
   PDF Embedding functions
   ---------------------------------------------------- */


embed = function (targetID) {

    if (!pluginTypeFound) { return false; }

    var targetNode = null;

    if (targetID) {

        //Allow users to pass an element OR an element's ID
        targetNode = (targetID.nodeType && targetID.nodeType === 1) ? targetID : document.getElementById(targetID);

        //Ensure target element is found in document before continuing
        if (!targetNode) { return false; }

    } else {

        targetNode = document.body;
        setCssForFullWindowPdf();
        width = "100%";
        height = "100%";

    }

    targetNode.innerHTML = '<object    data="' + url + '" type="application/pdf" width="' + width + '" height="' + height + '"></object>';

    return targetNode.getElementsByTagName("object")[0];

};

//The hash (#) prevents odd behavior in Windows
//Append optional Adobe params for opening document
url = encodeURI(obj.url) + "#" + buildQueryString(pdfOpenParams);
pluginTypeFound = pluginFound();

this.get = function (prop) { return get(prop); };
this.embed = function (id) { return embed(id); };
this.pdfobjectversion = pdfobjectversion;

return this;
};

Который был использован из репозитория gihub
Теперь, когда у вас есть эта настройка, вам нужно установить Adobe Reader
Ваша страница html должна выглядеть следующим образом (для тестирования):

<!DOCTYPE html>
<!-- saved from url=(0016)http://localhost -->
<head>
<title></title>
<link rel="javascript" href="js/pdfObject.js" />
</head>
<body style="border: 0; margin: 0; padding: 0">
    <embed src="..\path\to\your\file.pdf" width="600px" height="500px" alt="pdf" pluginspage="http://www.adobe.com/products/acrobat/readstep2.html">
</body>

Теперь сложная часть.
Вам нужно, чтобы эта страница html отображалась в вашем элементе управления WebBrowser, в случае успеха вам будет предложено установить обновление для вашего устройства чтения акробата.
После успешного обновления перезапустите приложение, и ваш файл должен появиться на вашей странице!
Удачного кодирования!

0 голосов
/ 27 сентября 2015

https://stackoverflow.com/a/14074771/5370609

этот код не работает для ссылок на PDF-файл внутри показанного PDF-файла.

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

0 голосов
/ 13 мая 2011

Боюсь, вы застряли, используя элемент управления WinForms PDF и разместив его в своем приложении WPF.Это немного раздражает, но это не сложно сделать.Вот статья и пример исходного кода:

http://hugeonion.com/2009/04/06/displaying-a-pdf-file-within-a-wpf-application/

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