SharePoint 2013下用C#批量修改PDF元数据的解决方案咨询
问题分析
原代码的核心问题是:SPFile.OpenBinaryStream()返回的是只读流,无法直接写入修改后的内容;且仅调用file.Update()不会触发文件内容的更新,必须通过SaveBinary方法传入修改后的字节流。
修正后的C#代码示例
using System.IO; using PdfSharp.Pdf; using Microsoft.SharePoint; public static void RemovePdfMetadata(IGrouping<string, SPFile> groupedFiles) { foreach (SPFile file in groupedFiles) { // 跳过非PDF文件 if (!file.Name.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)) continue; using (Stream originalStream = file.OpenBinaryStream()) using (PdfDocument document = PdfReader.Open(originalStream, PdfDocumentOpenMode.Modify)) { // 清除指定元数据 document.Info.Author = string.Empty; document.Info.ModifiedBy = string.Empty; // 若需清除其他相关元数据可添加,比如Creator // document.Info.Creator = string.Empty; // 将修改后的文档写入内存流 using (MemoryStream modifiedStream = new MemoryStream()) { document.Save(modifiedStream); modifiedStream.Position = 0; // 重置流指针到起始位置 // 覆盖SharePoint原文件 file.SaveBinary(modifiedStream); } } // 同步更新SharePoint列表项的属性(避免列表视图显示旧数据) SPListItem item = file.Item; item["Author"] = null; item["Editor"] = null; // 用UpdateOverwriteVersion避免创建新版本,需保留版本历史则改用item.Update() item.UpdateOverwriteVersion(); } }
关键说明
- 流处理逻辑:通过
MemoryStream暂存修改后的PDF内容,再调用SPFile.SaveBinary()写入SharePoint,这是修改SPFile内容的标准方式。 - 元数据同步:除了清除PDF文档内部的元数据,必须同步更新SharePoint列表项的
Author和Editor字段,否则列表视图仍会显示旧的作者/修改者信息。 - 批量操作优化:处理10000个文件时,建议分批次执行(比如每50-100个为一批),避免内存占用过高;若文档库有事件接收器,建议临时禁用以提升处理速度。
- 权限要求:执行代码的账号需拥有目标文档库的编辑权限,确保能覆盖文件和修改列表项属性。
内容的提问来源于stack exchange,提问作者Stonners
相关产品推荐
相关产品推荐

