最近项目中遇到一个业务场景,模板内容是一个word文件,导出一个证明的pdf文件,但是里面的信息是动态的,根据不同的登录用户信息来的。刚开始觉得还是有点麻烦,简单梳理了一下逻辑,大概有2中实现方式(或许还有其他第三种方式)。
1.根据模板内容每次都是重新生成pdf文件导出
2.根据模板内容把动态的东西进行覆盖处理,在通过pdf导出
用MiniWord,Aspose.Words。
通过word模板内容将动态的内容通过标识符进行替换,规则是{{name}},这个name是自定义的名称。
代码是如何实现呢??
1.首先定义替换的数据字典,用这种类型Dictionary<string, object> 定义
var dataDict = new Dictionary<string, object> { ["Name"] = “xxxx”, ["EndTime"] = DateTime.Today.ToString("yyyy年MM月dd日"), ["Image"] = new MiniWordPicture() { Path = string.Concat(AppDomain.CurrentDomain.BaseDirectory, @"xxxx.png"), Height = 60, Width = 180 } };
2.实现填充word模板数据
private async Task<string> CreateDownloadUrlAsync(Dictionary<string, object> dataDict) { var fileName = "xxx.pdf"; var templateUrl = string.Concat(AppDomain.CurrentDomain.BaseDirectory, @"muban.docx");//这个是word模板的地址 Stream stream = new MemoryStream(); MiniWord.SaveAsByTemplate(stream, templateUrl, dataDict); stream.Seek(0, SeekOrigin.Begin); var pdfBytes = WordToPdf(stream);//得到了一个pdf的字节数组 // 指定要保存PDF文件的路径 string filePath = "path_to_save_your_new_pdf_file.pdf"; // 将字节流写入文件 File.WriteAllBytes(filePath, pdfBytes); return filePath; } /// <summary> /// word转pdf /// </summary> /// <param name="wordFile">word文件</param> /// <returns></returns> public static byte[] WordToPdf(Stream wordFile) { Stream pdf = new MemoryStream(); Aspose.Words.Document document = new Aspose.Words.Document(wordFile); document.Save(pdf, Aspose.Words.SaveFormat.Pdf); pdf.Seek(0, SeekOrigin.Begin); var reBytes = pdf.ToBytes(); pdf.Close(); wordFile.Close(); return reBytes; }
到这里就好了,希望有所帮助。