winforms 如何修复从资源加载PDF文件?

31moq8wy  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(116)

我正在使用C#和Visual Studio 2017。我的Windows表单应用程序中有一个Web浏览器视图。我尝试在Web浏览器视图中查看PDF文件,但无法从我的资源文件夹加载。我不想将文件存储在本地,因为我希望能够在另一台PC上使用它。
在Resources.resx中,我单击了“添加资源”-“添加现有文件”-选择了我的PDF“test.pdf”,然后在属性中,我将文件设置为“嵌入式资源”和“始终复制”
我正在尝试像这样加载文件:

public void loadPDF()
    {
   string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,   @"projectPDF\projectPDF\Resources\test.pdf");           
            this.webView.Navigate(file);           

    }

然后在一个按钮点击事件中调用它,如下所示:加载PDF();
现在,当我单击按钮时,文件没有显示在Web浏览器视图中。我哪里出错了?

dohp0rv5

dohp0rv51#

嵌入式资源并不存储在一个神奇的“文件夹”中,它实际上是嵌入到EXE本身中的,因此在程序构建后无法更改。
复制到解决方案中的文件只是您选择要嵌入的文件的副本,在生成程序集时,它使用此副本来嵌入,因为原始文件可能不再位于您先前指定的路径中,尤其是在不同计算机上的团队中工作时。
“始终复制”标志对嵌入的资源没有任何意义,这只是向Visual Studio指示在生成程序时应将文件复制到“bin/Debug”文件夹(使用“Debug”配置)。
您可以沿着以下操作将PDF存储在临时文件中,然后显示它:

var pdfBytes = Properties.Resources.MY_PDF; // Where "MY_PDF" is the name of your resource
var fileTempPath = Path.GetTempFileName(); // Get a temp file path
File.WriteAllBytes(fileTempPath, pdfBytes); // Write the temp file with PDF contents
webView.Navigate(fileTempPath); // navigate to the temp file

不要忘记清理你的临时文件时,你做的pdf!

xtfmy6hx

xtfmy6hx2#

没有临时文件的解决方案:

public static async void test(byte[] pdfBytes)
    {

        string pdfBase64 = Convert.ToBase64String(pdfBytes);

        string html = "<!DOCTYPE html><html><head></head>"
                       + "<style>"
                       + "body { margin: 0; }"
                       + "iframe {display: block; background: #000; border: none; height: 100vh; width: 100vw;}"
                       + "</style>"
                       + $"<body> " + $" <iframe src = \"data: Application/pdf; base64,{pdfBase64} \" > " + " </iframe></body></html> ";

        var webView = new WebView2();

        var win = new System.Windows.Window();

        win.Content = webView;
        win.Loaded += async (sender, e) =>
        {
            await webView.EnsureCoreWebView2Async();
            webView.NavigateToString(html);
        };

        win.Show();
    }

它会打开一个新的wpf窗口来显示. pdf文件。
用法:

test(Properties.Resources.MY_PDF)

编辑:根据文档:
htmlContent参数不能大于2 MB(2 * 1024 * 1024字节)

相关问题