Как установить шрифт по умолчанию для iText7 / pdfhtml

Различные комментарии записываются в таблицу PDF. В таблице один столбец.

Комментарии поступают из редактора HTML из веб-приложения и содержат текст HTML, который выводится с помощью pdfhtml.

Примеры для комментариев:

  • текст, выделенный жирным шрифтом и курсивом .
  • большой
    средний
    < span style = "font-size: 8px"> small

Весь вывод должен быть в Verdana, но должны появиться некоторые другие шрифты (AgencyFB) (в промежутках во втором примере).

Код

public byte[] CreateDoc()
{
    using (MemoryStream stream = new MemoryStream())
    {
        using (PdfWriter writer = new PdfWriter(stream))
        {
            PdfDocument pdfDoc = new PdfDocument(writer);
            Document doc = new Document(pdfDoc, PageSize.A4);

            PdfFont font = PdfFontFactory.CreateRegisteredFont("Verdana", PdfEncodings.CP1252, true);
            float fontSize = 11f;

            Table table = new Table(1);
            table.AddCell(new Cell().Add(new Paragraph("no Html").SetFont(font).SetFontSize(fontSize)));

            string comment1 = "<div>a <b>bold</b> and an <i>italic</i> text.</div>";
            string comment2 = "<div><span style=\"font-size: 18px\">large</span><div><div><span style=\"font-size: 11px\">medium</span><div><div><span style=\"font-size: 8px\">small</span></div>";

            InsertHtmlCell(table, font, fontSize, comment1);
            InsertHtmlCell(table, font, fontSize, comment2);

            doc.Add(table);

            doc.Flush();
            doc.Close();
            pdfDoc.Close();
            writer.Close();
        }

        byte[] buffer = stream.ToArray();

        return buffer;
    }
}

private void InsertHtmlCell(Table table, PdfFont f, float fontSize, string comment)
{
    var cell = new Cell(1, 1);

    // Without ConverterProperties, "times" is used
    ConverterProperties prop = new ConverterProperties();
    prop.SetFontProvider(new DefaultFontProvider(false, false, true));
    var elements = HtmlConverter.ConvertToElements(comment, prop).Cast<IBlockElement>();
    foreach (var element in elements)
    {
        // without the following 2 lines always "AgencyFB" is used.
        element.SetProperty(Property.FONT, f);
        element.SetProperty(Property.FONT_SIZE, new UnitValue(UnitValue.CreatePointValue(fontSize)));
        cell.Add(element);
    }

    table.AddCell(cell);
}

Результат:

"жирный", "большой", "средний" и "маленький": AgencyFB "курсив": BookAntiqua

Но весь выход должен быть в Вердане. Как я могу этого достичь?

1 ответ

Вы говорите поставщику шрифтов загрузить все системные шрифты. Если вам определенно не нужны все они, вы можете просто иметь белый список шрифтов, которые вы хотите использовать. В вашем случае вам нужно добавить шрифты Verdana Regular, Verdana Bold и Verdana Italic.

Вот как это можно сделать:

FontProvider fontProvider = new DefaultFontProvider(false, false, false);
fontProvider.addFont("C:/Windows/Fonts/verdana.ttf");
fontProvider.addFont("C:/Windows/Fonts/verdanab.ttf"); // Bold
fontProvider.addFont("C:/Windows/Fonts/verdanai.ttf"); // Italic
Другие вопросы по тегам