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

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

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

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

  • a полужирный и itali c текст.
  • большой
    средний
    маленький

Весь вывод должен быть в 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);
}

Результат: enter image description here

«жирный», «большой» , "средний" и "маленький": AgencyFB "itali c": BookAntiqua

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

1 Ответ

0 голосов
/ 03 апреля 2020

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

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

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
...