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  參考官方文檔

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM