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依赖包)。
步骤如下:
安装NuGet包:
PdfSharp和System.Drawing.Common编写生成预览图的方法,将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())}"; } } } }
- 在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
相关产品推荐
相关产品推荐

