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

Blazor Server文档应用:如何获取解决方案资源管理器中PDF文件的元数据及生成预览图?

解决方案:提取PDF元数据与生成预览图

我来帮你搞定这个问题,在Blazor Server中提取PDF的元数据(比如创建日期、文件名)以及生成预览图是完全可行的,下面分两部分给你详细的实现方案,结合你现有的代码来调整:

一、提取PDF元数据(文件名、创建日期)

这里分两种方式:一种是直接从本地文件系统获取基础文件信息,另一种是读取PDF文件内部的元数据(更准确,比如文档本身的创建时间)。

1. 从本地文件系统获取基础信息

你可以用FileInfo类直接获取文件的文件名、创建日期等,这部分不需要额外的PDF库,代码可以这样修改:

async Task DownloadBinary()
{
    var filePath = "C://Development//CsharpApplications//AlbertBartletPortal//AlbertBartletPortal//PDFs//P45.pdf";
    var fileInfo = new FileInfo(filePath);
    
    // 获取基础文件信息
    string fileName = fileInfo.Name;
    DateTime creationTime = fileInfo.CreationTime;
    DateTime lastModifiedTime = fileInfo.LastWriteTime;

    // 原有的读取文件逻辑(改用using自动释放流)
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        byte[] pdfData = new byte[fs.Length];
        await fs.ReadAsync(pdfData, 0, Convert.ToInt32(fs.Length));
        
        try
        {
            await JSRuntime.InvokeVoidAsync("BlazorDownloadFile", fileName, "application/octet-stream", pdfData);
        }
        catch(Exception ex)
        {
            // 这里可以添加异常日志记录
        }
    }
}

2. 读取PDF内部的元数据(更精准)

如果需要获取PDF文档本身的元数据(比如作者、文档创建日期、标题等),推荐使用PdfSharp或者iTextSharp这类.NET PDF处理库。以PdfSharp为例:

首先在项目中安装NuGet包:PdfSharp

然后编写读取元数据的方法:

using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

// 新增方法获取PDF内部元数据
Dictionary<string, object> GetPdfMetadata(string filePath)
{
    var metadata = new Dictionary<string, object>();
    using (var document = PdfReader.Open(filePath, PdfDocumentOpenMode.ReadOnly))
    {
        // 优先取PDF内部标题,没有则用文件名
        metadata["FileName"] = !string.IsNullOrEmpty(document.Info.Title) ? document.Info.Title : new FileInfo(filePath).Name;
        metadata["CreationDate"] = document.Info.CreationDate;
        metadata["Author"] = document.Info.Author;
        metadata["Subject"] = document.Info.Subject;
    }
    return metadata;
}

// 在DownloadBinary中调用获取元数据
async Task DownloadBinary()
{
    var filePath = "C://Development//CsharpApplications//AlbertBartletPortal//AlbertBartletPortal//PDFs//P45.pdf";
    var pdfMetadata = GetPdfMetadata(filePath);
    
    // 使用元数据
    string docName = pdfMetadata["FileName"].ToString();
    DateTime docCreationDate = (DateTime)pdfMetadata["CreationDate"];

    // 原有的下载逻辑...
}

二、生成PDF预览图

生成PDF的预览图(比如第一页的缩略图),可以用PdfSharp配合System.Drawing.Common来实现(注意:Blazor Server是服务器端运行,Windows环境直接可用,Linux环境需要额外安装libgdiplus依赖包)。

步骤如下:

  1. 安装NuGet包:PdfSharp和System.Drawing.Common

  2. 编写生成预览图的方法,将PDF第一页转换成Base64字符串,方便在Blazor页面显示:

using System.Drawing;
using System.Drawing.Imaging;
using PdfSharp.Pdf;
using PdfSharp.Drawing;

// 生成PDF第一页的预览图Base64字符串
string GeneratePdfPreview(string filePath, int width = 200, int height = 280)
{
    using (var document = PdfReader.Open(filePath, PdfDocumentOpenMode.ReadOnly))
    {
        if (document.PageCount == 0) return string.Empty;
        
        // 获取PDF第一页
        var page = document.Pages[0];
        
        // 创建Bitmap用于绘制预览图
        using (var bitmap = new Bitmap(width, height))
        using (var g = Graphics.FromImage(bitmap))
        using (var xg = XGraphics.FromGraphics(g, new XSize(width, height)))
        {
            // 计算缩放比例,保证预览图完整显示
            var scale = Math.Min((double)width / page.Width, (double)height / page.Height);
            xg.ScaleTransform((float)scale);
            
            // 将PDF页面绘制到Bitmap上
            XGraphicsPdfRenderer renderer = new XGraphicsPdfRenderer(xg, XGraphicsPdfRendererMode.PdfPage);
            renderer.RenderPage(page);
            
            // 将Bitmap转换为Base64格式
            using (var ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Png);
                return $"data:image/png;base64,{Convert.ToBase64String(ms.ToArray())}";
            }
        }
    }
}
  1. 在Blazor页面中使用预览图:

在@code区域添加变量存储预览图Base64:

string pdfPreviewUrl;

protected override void OnInitialized()
{
    var filePath = "C://Development//CsharpApplications//AlbertBartletPortal//AlbertBartletPortal//PDFs//P45.pdf";
    pdfPreviewUrl = GeneratePdfPreview(filePath);
}

然后在页面的卡片中替换图片:

<div class="card" @onclick="DownloadBinary" style="color:white; width: 200px; height: 150px">
    @if (!string.IsNullOrEmpty(pdfPreviewUrl))
    {
        <img class="img-thumbnail" src="@pdfPreviewUrl" style="width:100%; height:80px; object-fit:contain;" />
    }
    <div class="card-body">
        <h5 class="card-title mb-3">
            <p style="color: black"> Megan Paterson - @(new FileInfo("C://Development//CsharpApplications//AlbertBartletPortal//AlbertBartletPortal//PDFs//P45.pdf").Name)</p>
        </h5>
        <center><img src="Images/img.png" width="40px" height="40px" /></center>
    </div>
</div>

注意事项

  • 若部署到Linux环境,需要先安装libgdiplus依赖包(命令:sudo apt-get install libgdiplus),否则System.Drawing.Common会报错。
  • 处理大体积PDF时,建议将元数据提取和预览图生修改为异步方法,避免阻塞UI线程。
  • 建议将文件路径改为配置项或从数据库读取,不要硬编码在代码中,提升扩展性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:07:40