需求是根据查询出来的数据动态生成一个PDF,包含图表、文本、分页等相关的基础元素,然后上传到OSS,共他人下载。先大概看下PDF的样式:
我的做法是根据动态数据构建一个HTML,然后转为PDF流(生成流直接上传OSS,不需要本地保存文件了),用的库文件是OpenHtmlToPdf。
代码如下:
/// <summary> /// HTML转为PDF /// </summary> /// <param name="pmPartnerStatisticsModel"></param> /// <returns></returns> public static byte[] GeneratePDFStream(DataTable data) { string html = CreateHtml(data); using (WebClient wc = new WebClient()) { byte[] pdfBytes = Pdf .From(html) .OfSize(PaperSize.A4) .WithoutOutline() .WithMargins(2.5.Centimeters()) .Portrait() .Comressed() .Content(); return pdfBytes; } }
上述方法中有个CreateHtml方法,就是用来创建你想要的HTML,具体的按照自己设的的模板写就可以,这里说一下,让HTML转为PDF的时候,自定义分页。其实很简单,在HTML中,我们为每页加一个DIV,然后加上样式page-break-inside:avoid; 转为PDF的时候就可以分页了。举例如下:
<!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>xx</title> <style type="text/css"> .pdfpage{page-break-inside:avoid;} </style> </head> <body> <div class="pdfpage">第一页</div> <div class="pdfpage">第二页</div> </body> </html>