From 591aa86a584b26ed8817ab1b8b7f8c1defb935e2 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 14 Aug 2025 13:32:36 +0800 Subject: [PATCH] Support custom `FontProvider` in `ITextHtmlToPdfRenderer`. --- .../Pdf/IText/ITextHtmlToPdfRenderer.cs | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs index cd83333495..308f26f086 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Projects/Pdf/IText/ITextHtmlToPdfRenderer.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using iText.Html2pdf; using iText.Kernel.Pdf; using iText.Kernel.Pdf.Action; +using iText.Layout.Font; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Docs.Utils; @@ -14,13 +15,13 @@ namespace Volo.Docs.Projects.Pdf.IText; public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer, ITransientDependency { protected IOptions Options { get; } - + public ITextHtmlToPdfRenderer(IOptions options) { Options = options; } - - public virtual Task RenderAsync(string title, string html, List documents) + + public virtual async Task RenderAsync(string title, string html, List documents) { var pdfStream = new MemoryStream(); using (var pdfWriter = new PdfWriter(pdfStream)) @@ -29,33 +30,43 @@ public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer, ITransientDependency using (var pdfDocument = new iText.Kernel.Pdf.PdfDocument(pdfWriter)) { pdfDocument.GetDocumentInfo().SetTitle(title); - CreatePdfFromHtml(html, pdfDocument); - AddOutlinesToPdf(pdfDocument, documents); + await CreatePdfFromHtmlAsync(html, pdfDocument); + await AddOutlinesToPdfAsync(pdfDocument, documents); } } - + pdfStream.Position = 0; - return Task.FromResult(pdfStream); + return pdfStream; } - private void CreatePdfFromHtml(string html, iText.Kernel.Pdf.PdfDocument pdfDocument) + protected virtual async Task CreatePdfFromHtmlAsync(string html, iText.Kernel.Pdf.PdfDocument pdfDocument) { var converter = new ConverterProperties(); + var fontProvider = await GetFontProviderAsync(); + if (fontProvider != null) + { + converter.SetFontProvider(fontProvider); + } var tagWorkerFactory = new HtmlIdTagWorkerFactory(pdfDocument); converter.SetTagWorkerFactory(tagWorkerFactory); - HtmlConverter.ConvertToDocument(html, pdfDocument, converter); - tagWorkerFactory.AddNamedDestinations(); } - private void AddOutlinesToPdf(iText.Kernel.Pdf.PdfDocument pdfDocument, List documents) + protected virtual Task GetFontProviderAsync() + { + return Task.FromResult(null); + } + + protected virtual Task AddOutlinesToPdfAsync(iText.Kernel.Pdf.PdfDocument pdfDocument, List documents) { var pdfOutlines = pdfDocument.GetOutlines(false); BuildPdfOutlines(pdfOutlines, documents); + + return Task.CompletedTask; } - private void BuildPdfOutlines(PdfOutline parentOutline, List pdfDocumentNodes) + protected virtual Task BuildPdfOutlines(PdfOutline parentOutline, List pdfDocumentNodes) { foreach (var pdfDocumentNode in pdfDocumentNodes) { @@ -63,7 +74,7 @@ public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer, ITransientDependency { continue; } - + var outline = parentOutline.AddOutline(pdfDocumentNode.Title); if (!pdfDocumentNode.Id.IsNullOrWhiteSpace()) { @@ -75,5 +86,7 @@ public class ITextHtmlToPdfRenderer : IHtmlToPdfRenderer, ITransientDependency BuildPdfOutlines(outline, pdfDocumentNode.Children); } } + + return Task.CompletedTask; } -} \ No newline at end of file +}