You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从SQL Server读取二进制PDF数据,点击按钮在新WebView展示

实现点击ListView按钮查看SQL Server存储的PDF二进制数据

我来帮你一步步搞定这个需求,整体流程就是点击按钮→获取对应行的PDF二进制数据→转成WebView可加载的格式→跳转到新页面展示,具体实现如下:

1. 给ListView的查看按钮绑定命令

首先在你的XAML里,给ListView的ItemTemplate中的按钮绑定命令,并把当前项作为参数传递,这样点击时就能拿到对应行的数据:

<!-- 假设你的ListView命名为"PdfListView",绑定的数据源是ViewModel里的"PdfItems"集合 -->
<ListView x:Name="PdfListView" ItemsSource="{Binding PdfItems}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Orientation="Horizontal" Padding="12,6">
                    <!-- 这里放你原本的其他显示控件,比如文本标签等 -->
                    <Label Text="{Binding Title}" VerticalOptions="Center" />
                    
                    <!-- 查看PDF按钮,绑定到ViewModel的命令,并传递当前项 -->
                    <Button Text="查看PDF" 
                            Margin="10,0,0,0"
                            Command="{Binding BindingContext.ViewPdfCommand, Source={x:Reference PdfListView}}"
                            CommandParameter="{Binding .}" />
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

2. 在ViewModel中实现命令逻辑

假设你用MVVM模式(推荐),在ViewModel里定义一个ICommand来处理点击事件,获取对应项的二进制数据后,跳转到PDF查看页面:

using Xamarin.Forms;
using MvvmHelpers; // 如果用MvvmHelpers的RelayCommand,或者自己实现ICommand

public class YourViewModel : BaseViewModel
{
    // 你的数据源集合
    public ObservableRangeCollection<YourDataModel> PdfItems { get; set; }

    // 查看PDF的命令
    public ICommand ViewPdfCommand { get; }

    public YourViewModel(INavigation navigation)
    {
        Navigation = navigation;
        ViewPdfCommand = new RelayCommand<YourDataModel>(ExecuteViewPdf);
        // 初始化PdfItems,这里假设你已经从SQL Server获取到数据了
        PdfItems = new ObservableRangeCollection<YourDataModel>(GetDataFromSqlServer());
    }

    private INavigation Navigation { get; }

    private void ExecuteViewPdf(YourDataModel selectedItem)
    {
        if (selectedItem == null || selectedItem.PdfData == null)
        {
            // 可以加个提示,比如"暂无PDF数据"
            return;
        }

        // 跳转到PDF查看页面,把二进制数据传过去
        var pdfViewerPage = new PdfViewerPage(selectedItem.PdfData);
        Navigation.PushAsync(pdfViewerPage);
    }

    // 你已有的从SQL Server获取数据的方法,确保返回的YourDataModel包含PdfData字段(byte[]类型)
    private IEnumerable<YourDataModel> GetDataFromSqlServer()
    {
        // 你的数据库查询逻辑,比如用EF或者SqlDataReader
        // 示例:
        // using(var db = new YourDbContext())
        // {
        //     return db.YourTable.ToList();
        // }
    }
}

这里的YourDataModel需要包含存储PDF二进制数据的字段,比如:

public class YourDataModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    // 对应SQL Server里的二进制字段(比如varbinary(max))
    public byte[] PdfData { get; set; }
}

3. 创建PDF查看页面(带WebView)

接下来创建一个专门的页面,把二进制PDF数据转成WebView能加载的格式,有两种常用方式:

方式一:转成Base64字符串用Data URI加载(无需创建临时文件)

这种方式更轻便,直接把二进制转成Base64,用data:协议加载,代码如下:

using Xamarin.Forms;

public class PdfViewerPage : ContentPage
{
    public PdfViewerPage(byte[] pdfBytes)
    {
        Title = "查看PDF";

        var webView = new WebView
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };

        // 把二进制转成Base64字符串,构造Data URI
        string base64Pdf = System.Convert.ToBase64String(pdfBytes);
        string pdfDataUri = $"data:application/pdf;base64,{base64Pdf}";

        webView.Source = new UrlWebViewSource { Url = pdfDataUri };

        Content = new StackLayout
        {
            Children = { webView }
        };
    }
}

方式二:保存为临时文件加载(适合大体积PDF)

如果PDF文件很大,Base64可能会有性能问题,就可以保存到应用的私有临时目录,再让WebView加载:

using Xamarin.Forms;
using System.IO;

public class PdfViewerPage : ContentPage
{
    public PdfViewerPage(byte[] pdfBytes)
    {
        Title = "查看PDF";

        var webView = new WebView
        {
            HorizontalOptions = LayoutOptions.FillAndExpand,
            VerticalOptions = LayoutOptions.FillAndExpand
        };

        // 创建临时PDF文件
        string tempFileName = $"{System.Guid.NewGuid()}.pdf";
        string tempFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), tempFileName);
        File.WriteAllBytes(tempFilePath, pdfBytes);

        // 根据不同平台设置WebView的源(路径格式有差异)
        if (Device.RuntimePlatform == Device.Android)
        {
            webView.Source = new UrlWebViewSource { Url = $"file:///{tempFilePath}" };
        }
        else if (Device.RuntimePlatform == Device.iOS)
        {
            webView.Source = new UrlWebViewSource { Url = $"file://{tempFilePath}" };
        }
        else if (Device.RuntimePlatform == Device.UWP)
        {
            webView.Source = new System.Uri($"ms-appdata:///local/{tempFileName}");
        }

        Content = new StackLayout
        {
            Children = { webView }
        };
    }
}

4. 注意事项

  • 平台兼容性:部分Android设备的默认WebView可能需要启用JavaScript才能正常渲染PDF,你可以在WebView的属性里设置IsJavaScriptEnabled="True"。
  • 数据读取正确性:确保从SQL Server读取二进制数据时没有出错,比如用SqlDataReader.GetBytes或者Entity Framework直接映射byte[]类型。
  • 内存管理:如果是大体积PDF,看完后记得删除临时文件(方式二的情况),避免占用过多存储空间。

内容的提问来源于stack exchange,提问作者waqas waqas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:21:52