1. 程式人生 > 實用技巧 >Net Core 匯出PDF

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); }

注:本文章參考https://www.cnblogs.com/hulizhong/p/12201859.html