使用 itext7 (7.2.0) AND itext7.pdfhtml (4.0.0) AND .Net Core 5.0
將 itext5 報告轉換為 itext7
使用 html 樣式“page-break-before:always;”強制分頁時出現錯誤
public FileResult PrintHtmlToPDFPageBreak() { StringBuilder sbBody = new StringBuilder(); sbBody.Append("<html>"); sbBody.Append("<body>"); sbBody.Append("<p>This is first page</p>"); sbBody.Append("<div style='page-break-before: always;'></div>"); sbBody.Append("<p>This is second page</p>"); sbBody.Append("</body>"); sbBody.Append("</html>"); string htmlContent = sbBody.ToString(); bool isPortrait = true; string reportTitle = "Testing iText7 in .Net5"; //generate the byte array for the Pdf byte[] pdfContent = null; //Create a System.IO.MemoryStream object using (MemoryStream memoryStream = new MemoryStream()) { //Initialize PDF writer PdfWriter pdfWriter = new PdfWriter(memoryStream); //Initialize PDF document PdfDocument pdfDocument = new PdfDocument(pdfWriter); //Initialize document Document document = (isPortrait ? new Document(pdfDocument, PageSize.LETTER) : new Document(pdfDocument, PageSize.LETTER.Rotate())); var headerHeight = String.IsNullOrEmpty(reportTitle) ? 70f : 120f; document.SetMargins(headerHeight, 10f, 56f, 10f); //top, right, bottom, left #region HTML to PDF //Convert to Elements ConverterProperties converterProperties = new ConverterProperties(); IList<IElement> elements = HtmlConverter.ConvertToElements(htmlContent, converterProperties); foreach (var element in elements) document.Add((IBlockElement)element); #endregion //Close the Document document.Close(); pdfContent = memoryStream.ToArray(); //Close the MemoryStream memoryStream.Close(); } //return the byte array in the form of FileContentResult for browser download var fileName = "ConvertHtmlToPDF.pdf"; return File(pdfContent, System.Net.Mime.MediaTypeNames.Application.Pdf, fileName); }
uj5u.com熱心網友回復:
您尚未附加堆疊跟蹤,但我很確定問題出在這兩行:
foreach (var element in elements)
document.Add((IBlockElement)element);
您只是在鑄造而不檢查鑄造是否合法。只需處理元素是AreaBreak.
uj5u.com熱心網友回復:
謝謝Alexey,您的解決方案奏效了。
舊代碼:
foreach (var element in elements)
document.Add((IBlockElement)element);
新代碼:
foreach (var element in elements)
{
if (element.GetType().Name == "HtmlPageBreak")
document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
else
document.Add((IBlockElement)element);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/418566.html
標籤:
