将Webview2 Source直接设置为二进制流

Wer*_*ner 6 c# vb.net sql-server winforms webview2

我的应用程序中有一个Webview2控件,用于查看PDF文档。
该应用程序还可以在 MS SQL Server PDF 数据中存储和读取数据。

目前,我正在从 SQL 检索二进制数据,将它们转换为临时文件到磁盘并设置:

webview2.source = New Uri("file://" + filename)  
Run Code Online (Sandbox Code Playgroud)

到目前为止,工作正常,但我当然希望在不写入和读取磁盘的情况下完成这项工作。

有没有办法在不访问磁盘的情况下执行相同的操作?

更新(按照建议),我尝试过的。为了更好地理解部分代码:

                Dim fieldOrdinal = reader.GetOrdinal(ColumnName)
                reader.Read()
                Dim blob = New Byte(reader.GetBytes(fieldOrdinal, 0, Nothing, 0, 0) - 1) {}
                reader.GetBytes(fieldOrdinal, 0, blob, 0, blob.Length)

                Dim pdfBase64 As String = Convert.ToBase64String(blob)
                Dim html As String = "<!DOCTYPE html><html><head></head><body><div>" & $"<iframe width=100% height=500 src=\" & Chr(&H22) & "data:Application/pdf;base64,{pdfBase64}\" & Chr(&H22) & ">" & "</iframe></div></body></html>"
Run Code Online (Sandbox Code Playgroud)

webview2控件显示一个框架,但没有内容

最终更新:这里是(正确的)VB 翻译和工作代码:

Dim html As String = "<!DOCTYPE html><html><head></head><body><div>" & $"<iframe width=100% height=500 src=""data:Application/pdf;base64,{pdfBase64}"">" & "</iframe></div></body></html>"
Run Code Online (Sandbox Code Playgroud)

Jim*_*imi 8

您可以将 PDF 嵌入到IFRAMEBase64 中,就像嵌入图像一样。
在这种情况下,mime 类型当然是application/pdf使用Convert.ToBase64String()
将源 PDF 字节转换为 Base64 ,使用标准 HTML5 标头并将和/或容器设置为所需的大小。IFRAMEDIV

使用WebView2.NavigateToString()方法加载带有嵌入 PDF 的 HTML:

  • 请参阅备注部分:目前内容的大小不能超过2097152字节(2MB)
string pdfBase64 = Convert.ToBase64String([Your PDF bytes]);

string html = "<!DOCTYPE html><html><head></head><body><div>" +
    $"<iframe width=100% height=500 src=\"data:application/pdf;base64,{pdfBase64}\">" +
    "</iframe></div></body></html>";

webView2.NavigateToString(html);
Run Code Online (Sandbox Code Playgroud)

VB.Net版本:

Dim pdfBytes = [DataReader].GetSqlBytes([DataReader].GetOrdinal("[Column Name]")).Value
Dim pdfBase64 As String = Convert.ToBase64String(pdfBytes)

Dim html As String = "<!DOCTYPE html><html><head></head><body><div>" &
    $"<iframe width=100% height=500 src=""data:Application/pdf;base64,{pdfBase64}"">" &
    "</iframe></div></body></html>"

webView2.NavigateToString(html)
Run Code Online (Sandbox Code Playgroud)

大小iframe不应该这样设置,您应该使用 CSS 样式(可能还需要一个简单的 JavaScript 来处理包含PDF 的窗口大小的后期重新定义)。
您可以构建一个简单的 HTML 模板并按照描述填充 Base64 内容。