Net Core 导出PDF
最近项目中一个需求涉及到导出PDF 参考了许多大佬的文章 也试过了 前端 后台等方法导出PDF 最后决定用后端拼接HTML 然后将HTML页面导出为PDF的方式
NuGet包
Select.HtmlToPdf.NetCore 简单好用,缺点是仅支持Windows,部署Linux不支持
HtmlToPDFCore 免费 支持Windows Linux 但是功能简单,样式不稳定
PdfSharpCore Html内容转PDF较为麻烦
DinkToPdf 依赖wkhtmltopdf,需要附带exe应用程序
iTextSharp 5.0以后的收费了,而且NuGet包最低都在5.0以上,也就是收费
iTextSharp.LGPLv2.Core Html内容转PDF太复杂
PDF.Core 收费
HTML-Renderer.Core 较久没有维护支持,不兼容
HTML-Renderer.PdfSharp 可以使用但是不兼容Core
Spire.PDF 收费
ExpertPdf.HtmlToPdf.NetCore 收费
hiqpdf.free 免费不兼容Core
因为我这边部署至Win环境的 综合之后还是选择了Select.HtmlToPdf.NetCore
首先安装Nuget包
水机使用
public async Task<ActionResult> ExportPDF(NullableIdInput input) {
var entity = new SystemCase(); if (!input.Id.IsNullOrEmptyGuid()) { entity = await _systemCaseLogic.GetById(input.Id); }
//Html字符串 当然这里应该进行封装 var sb = new StringBuilder(); sb.Append(@"<!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title></title> <style> body { margin: 0; padding: 0; min-width: 1080px; } .m_table { border-collapse: separate; margin: 20px auto 0; min-width: 1900px; text-align: center; font: 500 17px '微软雅黑'; border-spacing: 0; border: 1px solid #EBEEF5; } .m_table th { background-color: #F7F3F7; } .m_table th, .m_table td { border-right: 1px solid #EBEEF5; border-bottom: 1px solid #EBEEF5; padding: 5px; height: 60px; width: 60px; } </style> </head> <body> <table class='m_table'> <tr> <th colspan='8' style='text-align:center;font-size:25px;'>xxxxx诊所病历</th> </tr> <tr> <th colspan='8' style='text-align:left;font-size:18px;'>患者信息</th> </tr> <tr> <td> 姓名:</td>") .Append($"<td> {entity.Name} </td> <td> 性别: </td>") .Append($"<td> {(entity.Gender?'男':'女')} </td><td> 出生: </td>") .Append($"<td> {entity.Birthday.ToString("yyyy-MM-dd")} </td><td> 电话: </td> <td> {entity.Mobile} </td>") .Append($" </tr> <tr><td> 身高:</td> <td> {entity.Height} cm</td><td> 体重: </td><td> {entity.Weight} kg</td>") .Append($"<td> 身份证号码: </td><td> {entity.IDNumber} </td><td> 民族: </td> <td> {entity.Nation} </td> </tr>") .Append($"<tr><td> 婚姻:</td> <td> {entity.MarriageStaus} </td><td> 职业: </td> <td> {entity.Occupation} </td>") .Append($"<td> 是否复诊: </td><td> {(entity.IsNotFirst?'是':'否')} </td><td> 就诊日期: </td><td> {entity.VisitDate.ToString("yyyy-MM-dd")} </td></tr>") .Append($"<tr> <td>邮寄地址/现住址:</td> <td colspan='7'>{entity.Address}</td> </tr>") .Append($"<tr> <td>主诉:</td> <td colspan='7'>{entity.Description} </td> </tr>") .Append($"<tr> <td>现病史:</td> <td colspan='7'>{entity.NowMedicalHistory}</td> </tr>") .Append($"<tr> <td>药物过敏史:</td> <td colspan='7'>{entity.DrugAllergyHistory} </td></tr>") .Append($"<tr> <td>既往病史:</td> <td colspan='7'> {entity.MedicalHistory} </td></tr>") .Append($"<tr> <td>吃饭:</td> <td colspan='7'> {entity.Eat} </td></tr>") .Append($"<tr> <td>大便:</td> <td colspan='7'> {entity.Defecate} </td></tr>") .Append($"<tr> <td>小便:</td> <td colspan='7'> {entity.Pee} </td></tr>") .Append($"<tr> <td>月经:</td> <td colspan='7'> {entity.Menstruation} </td></tr>") .Append($"<tr> <td>睡觉:</td> <td colspan='7'> {entity.Sleep} </td></tr>") .Append($"<tr> <td>过敏史:</td> <td colspan='7'> {entity.AllergicHistory} </td></tr>") .Append($"<tr> <td>遗传史:</td> <td colspan='7'> {entity.GeneticHistory} </td></tr>") .Append($"<tr> <td>辅助检查:</td> <td colspan='7'> {entity.AuxiliaryExamination} </td></tr>") .Append($"<tr> <td>其他补充:</td> <td colspan='7'> {entity.OtherRemark} </td></tr>") .Append($"<tr> <th colspan='8' style='text-align:left;font-size:18px;'>相关照片</th> </tr>") .Append($"<tr style='height: 300px;'> <td >舌苔照皮:</td> <td colspan='3'><img src='{Path.Combine(_environment.WebRootPath+ entity.FurImg)}' style='width:300px;height:250px'></td> <td >化验报告单:</td> <td colspan='3'><img src='{Path.Combine(_environment.WebRootPath + entity.AnalysisReport)}' style='width:300px;height:250px'></td> </tr>") .Append($"<tr> <th colspan='8' style='text-align:left;font-size:18px;'>诊断记录</th> </tr> <tr> <td>诊疗医生:</td> <td colspan='3'>{entity.Docter}</td> <td>诊疗时间:</td> <td colspan='3'>{entity.TherapyTime}</td> </tr>") .Append($"<tr> <td>诊疗方式:</td> <td colspan='3'>{entity.TherapyWay}</td> <td>诊疗科别:</td> <td colspan='3'>{entity.TherapyFamily}</td> </tr>") .Append($"<tr> <td>临床诊断:</td> <td colspan='7'>{entity.ClinicalDiagnosis}</td> </tr> <tr> <td>诊疗意见:</td> <td colspan='7'>{entity.MedicalOpinion}</td> </tr>") .Append($"<tr style='height: 200px;'> <td>RP:</td> <td colspan='7'>{entity.Remark}</td> </tr>") .Append($"<tr style='height: 300px;'> <td >处方一:</td> <td colspan='3'><img src='{Path.Combine(_environment.WebRootPath + entity.Prescription1)}' style='width:300px;height:250px'></td> <td >处方二:</td> <td colspan='3'><img src='{Path.Combine(_environment.WebRootPath + entity.Prescription2)}' style='width:300px;height:250px'></td> </tr>") .Append($"<tr> <th colspan='8' style='text-align:left;font-size:18px;'>订单信息</th> </tr> <tr> <td>部门标识:</td> <td colspan='3'>{entity.Department}</td> <td>医助姓名:</td> <td colspan='3'>{entity.DoctorAssistantName}</td> </tr>") .Append($"<tr> <td>订单金额:</td> <td colspan='3'>{entity.OrderAmount}</td> <td>是否拿药:</td> <td colspan='3'>{(entity.IsGetMedicine ? '是':'否')}</td> </tr>") .Append($"<tr> <td>方剂类型:</td> <td colspan='3'>{entity.PrescriptionType}</td> <td>服用天数:</td> <td colspan='3'>{entity.DrugDays}</td> </tr>") .Append($"<tr> <td>是否面诊:</td> <td colspan='3'>{(entity.IsFaceDiagnose?'是': '否')}</td> <td>其余备注:</td> <td colspan='3'>{entity.OtherRemark}</td> </tr> </table> </body> </html>");
//设置PDF参数 var Renderer = new HtmlToPdf(); Renderer.Options.PdfPageOrientation = PdfPageOrientation.Landscape;//设置页面方式-横向 PdfPageOrientation.Portrait 竖向 Renderer.Options.PdfPageSize = PdfPageSize.A4;//设置页面大小,30种页面大小可以选择 Renderer.Options.MarginTop = 10; //上下左右边距设置 Renderer.Options.MarginBottom = 10; Renderer.Options.MarginLeft = 10; Renderer.Options.MarginRight = 10; var docHtml = Renderer.ConvertHtmlString(sb.ToString());//根据html内容导出PDF //var docUrl = Renderer.ConvertUrl("https://fanyi.baidu.com/#en/zh/");//根据url路径导出PDF string webRootPath = _environment.WebRootPath; //获取项目静态文件绝对路径 var path = $"/ExportFile/ExportPDF/{DateTime.Now.ToString("yyyy")}" + $"/{DateTime.Now.ToString("MM")}/{DateTime.Now.ToString("MM-dd")}";//文件相对路径 var fileName = $"{Guid.NewGuid().ToString()}.pdf"; var savepathHtml = $"{webRootPath}/{path}/{fileName}";//保存绝对路径 if (!Directory.Exists(webRootPath + path)) { Directory.CreateDirectory(webRootPath + path); } docHtml.Save(savepathHtml); //var savepathUrl = $"{webRootPath}{path}{Guid.NewGuid().ToString()}-Url.pdf";//保存绝对路径 //docUrl.Save(savepathUrl); return File(path + "/" + fileName, "application/pdf", fileName); }
后续: 导出过程没问题 但是部署到服务器之后 遇到了问题
Conversion failure error 5.
经过一天的努力翻阅资料 终于确定是权限的问题
https://selectpdf.com/docs/Troubleshooting.htm 参考官方文档