在ASP.NET Core中使用JSReport将多个HTML文件转为多页单PDF文件
多HTML文件合并生成单PDF(JSReport + C#)
需求说明
有多个HTML文件(如test.html、test2.html、test3.html),需通过JSReport生成单个PDF,要求每个HTML对应PDF的独立一页。现有代码仅支持传递单个HTML数据,需修改为支持多文件内容传入。
原代码
byte[] pdfBytes = new byte[5]; pdfBytes = await GetPdfReport(sbFirstParagraph.ToString()); // HtmlText: 目前仅传递单个文件数据,需改为传递多个HTML文件数据 public async Task<byte[]> GetPdfReport(string HtmlText) { try { var reportObj = await jsreportObj.RenderAsync(new RenderRequest() { Template = new Template { Content = HtmlText, Engine = Engine.None, Recipe = Recipe.ChromePdf, Chrome = new Chrome { MarginLeft = "0", MarginRight = "0", Format = "A4", Width = "100%" } }, Options = new RenderOptions() { Preview = true, Timeout = 600000 } }); using (var memoryStream = new MemoryStream()) { await reportObj.Content.CopyToAsync(memoryStream); return memoryStream.ToArray(); } } catch (Exception e) { return new byte[] { }; } }
修改后的实现代码
调用示例
// 读取多个HTML文件内容(根据实际文件路径调整) var htmlContents = new List<string> { File.ReadAllText(@"path/to/test.html"), File.ReadAllText(@"path/to/test2.html"), File.ReadAllText(@"path/to/test3.html") }; byte[] pdfBytes = await GetPdfReport(htmlContents);
改造后的GetPdfReport方法
public async Task<byte[]> GetPdfReport(IEnumerable<string> htmlContents) { try { // 合并多个HTML内容,每个页面后添加强制分页符(最后一页自动省略) var mergedHtml = string.Join("<div style='page-break-after: always;'></div>", htmlContents); var reportObj = await jsreportObj.RenderAsync(new RenderRequest() { Template = new Template { Content = mergedHtml, Engine = Engine.None, Recipe = Recipe.ChromePdf, Chrome = new Chrome { MarginLeft = "0", MarginRight = "0", Format = "A4", Width = "100%" } }, Options = new RenderOptions() { Preview = true, Timeout = 600000 } }); using (var memoryStream = new MemoryStream()) { await reportObj.Content.CopyToAsync(memoryStream); return memoryStream.ToArray(); } } catch (Exception e) { // 建议添加异常日志记录,便于后续排查问题 return Array.Empty<byte>(); } }
关键修改点
- 参数调整:将方法参数从单个
string改为IEnumerable<string>,支持传入多个HTML内容集合 - 分页控制:使用CSS的
page-break-after: always;在每个HTML内容之间插入强制分页标记,确保每个HTML独立占一页 - 代码规范:用
Array.Empty<byte>()替代new byte[] { },写法更简洁规范
内容的提问来源于stack exchange,提问作者nittin aggarwal
相关产品推荐
相关产品推荐

