NetCore项目动态自定义word导出pdf

最近项目中遇到一个业务场景,模板内容是一个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;
 }
 
 

到这里就好了,希望有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值