iText7 - 使用 HtmlConverter 时如何防止字体变化?

iText7 - How do you prevent the font face from changing when using HtmlConverter?

在 C# 中,我尝试传入一个简单的 HTML 字符串,然后解析该字符串并将其添加到 PDF 文档中。在下面的示例中,我将字符串添加到 iText7 段落中。

我阅读了这篇文章并设法编写了以下代码。

https://itextpdf.com/en/resources/books/itext-7-converting-html-pdf-pdfhtml/chapter-1-hello-html-pdf

第一段 (p1),示例 1,呈现正确的字体 Helvetica。当然,我使用的是 SetAction 方法,这与文章中的方法完全不同。这仅用于演示目的。

第二段 (p2),示例 2,可以很好地转换 HTML,但单词 "link" 的字体呈现方式与 Helvetica 不同。似乎在呈现 HTML 时,它忽略了文档的字体。

Sample Screenshot

如何让"link"的字体变成Helvetica并使用例2的方法?我想我在这里遗漏了一些小东西。我是否需要定义 CSS class 因为我们在 HTML 土地上?

感谢您的任何建议。

class Program
{
    static void Main(string[] args)
    {
        var pdfWriter = new PdfWriter(@"c:\temp\test.pdf");
        var pdfDocument = new PdfDocument(pdfWriter);
        var document = new Document(pdfDocument);

        // Example 1
        var p1 = new Paragraph("p1: this is a test url")
            .SetFont(PdfFontFactory.CreateFont(StandardFonts.HELVETICA))
            .SetFontSize(12f)
            .SetFontColor(new DeviceCmyk(1f, .31f, 0, 0))
            .SetFixedPosition(35, 600, UnitValue.CreatePercentValue(100f))
            .SetAction(PdfAction.CreateURI("www.google.com"));

        document.Add(p1);

        // Example 2
        var html = @"p2: this is a <a href=""www.google.com"">test</a> url";
        var elements = HtmlConverter.ConvertToElements(html);

        var p2 = new Paragraph()
            .SetFont(PdfFontFactory.CreateFont(StandardFonts.HELVETICA))
            .SetFontSize(12f)
            .SetFontColor(new DeviceCmyk(1f, .31f, 0, 0))
            .SetFixedPosition(35, 550, UnitValue.CreatePercentValue(100f));

        foreach (var element in elements)
        {
            p2.Add((IBlockElement)element);
        }

        document.Add(p2);

        document.Close();
        pdfDocument.Close();
        pdfWriter.Close();
    }
}

pdfHTML 中的默认字体系列是 Times,您只为顶级元素覆盖它,而(几乎)所有嵌套级别的所有元素都有其字体系列在 ConvertToElements 调用后明确指定。要更改字体系列,最简单的解决方案确实是将一些 CSS 应用到您的初始 HTML。您可以直接在 style 声明中设置 font-family

var html = @"<p style=""font-family: Helvetica"">p2: this is a <a href=""www.google.com"">test</a> url</p>";

然后你甚至不必为你的段落设置字体,段落创建代码简化为

var p2 = new Paragraph()
    .SetFontSize(12f)
    .SetFontColor(new DeviceCmyk(1f, .31f, 0, 0))
    .SetFixedPosition(35, 550, UnitValue.CreatePercentValue(100f));

foreach (var element in elements)
{
    p2.Add((IBlockElement)element);
}