最近項目中一個需求涉及到導出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 參考官方文檔