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

kulphzqa  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(153)

我的应用程序中有一个Webview2控件,用于查看PDF文档。
该应用程序还可以将数据存储到MS SQL Server PDF并从中读取数据。
目前,我正在从SQL检索二进制数据,将它们转换为临时文件到磁盘,并设置:

webview2.source = New Uri("file://" + filename)

到目前为止,这工作得很好,但是我当然希望在不对磁盘进行阅读的情况下完成这项工作。
是否有方法在不访问磁盘的情况下执行相同操作?
更新(如建议),我尝试了什么。与部分代码更好地理解:

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>"

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>"
toiithl6

toiithl61#

您可以将PDF嵌入IFRAME作为Base64,与嵌入图像的方式相同。
在本例中,mime类型当然是application/pdf
使用Convert.ToBase64String()将源PDF字节转换为Base64,使用标准HTML5头并将IFRAME和/或DIV容器设置为所需大小。
使用WebView2.NavigateToString()方法加载包含嵌入PDF的HTML:

  • 请参阅“备注”部分:当前内容的大小不能超过2097152字节(2 MB)
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);

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)

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

kognpnkq

kognpnkq2#

下面是我正在使用的最终版本,在HTML框架中包含CSS,使pdf无边框,大小为父文件webview2的100% x 100%:

Dim pdfBase64 As String = Convert.ToBase64String(pdfBytes)
Dim html As String = "<!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>"

相关问题