gpt4 book ai didi

c# - 在无法工作的 WPF 应用程序中显示 PDF - WebBrowser 或 Adob​​e Control

转载 作者:太空狗 更新时间:2023-10-30 00:57:07 24 4
gpt4 key购买 nike

我需要在 WPF 应用程序中显示 PDF。从我一直在网上阅读的所有内容来看,似乎 [唯一?] 在 WPF 应用程序中显示 PDF 的方法是通过 Adob​​e 的控件或 WebBrowser 控件。我曾尝试使用 Adob​​e 的控件,但是,我一直无法添加 Reader 控件,因为出于某种原因我找不到它作为我可以添加到我的工具箱中的东西(即使添加了所需的引用)。我正在运行 Windows 7(64 位)、VS2010、.NET 4.0,并且安装了 Adob​​e Acrobat 7.0 Professional 和 Adob​​e Acrobat 9 Pro Extended,如果这与它有任何关系的话。所以无论如何,我决定在 WindowsFormsHost 中托管的 WebBrowser 控件中尝试它。我的 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 文件的确切位置。但是,当我运行它时,我看到的只是 WebBrowser 所在的完全空白的白色区域。我也试过像这样设置 .pdf 文件:

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

我得到了完全相同的结果。我知道 PDF 是在正确的位置创建的,因为我可以手动浏览并打开它。

有人知道为什么这不起作用吗?或者可能为什么我似乎没有将 Reader 控件作为一个选项?在这一点上,任何一种解决方案都可以,只是它们似乎都不起作用!

谢谢!

最佳答案

这是我做的...

主窗口 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;
}

}
}

关于c# - 在无法工作的 WPF 应用程序中显示 PDF - WebBrowser 或 Adob​​e Control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5993267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com