Повторное использование объекта font в iTextSharp

#c# #fonts #itextsharp

#c# #шрифты #itext

Вопрос:

У меня возникли проблемы при попытке определить объект шрифта iTextSharp, который я мог бы повторно использовать во всем классе.

Моей первой попыткой было использовать FontFactory.Метод GetFont в 2 частных методах, которые создают объекты PdfPCell:

 FontFactory.GetFont("helvetica", 8)
  

Проблема с этим заключается в том, что только один из методов печатает шрифт правильно, другой метод не будет печатать внутренний текст ячейки.

Затем я попытался создать статическое поле в классе, представляющем шрифт:

 private static Font _standardCellFont;

public static PdfPCell CreateTableHeaderCell(string cellText, int colspan = 1)
    {
        var innerCellText = new Phrase(cellText, PdfSupport._standardCellFont);
        innerCellText.Font.Color = BaseColor.WHITE;

        return new PdfPCell(innerCellText)
                       {
                           Colspan = colspan,
                           PaddingLeft = 5,
                           PaddingRight = 5,
                           FixedHeight = 10,
                           BackgroundColor = BaseColor.BLACK,
                           VerticalAlignment = Element.ALIGN_CENTER
                       };
    }

public static PdfPCell CreateTableCell(string cellText, int colspan = 1, int rowspan = 1, bool bold = false, float minHeight = 0)
    {
        var cellInnerText = 
            bold ? 
            new Phrase(cellText, FontFactory.GetFont("helvetica", 8, Font.BOLD)) :
            new Phrase(cellText, PdfSupport._standardCellFont);

        return new PdfPCell(cellInnerText)
                   {
                       Border = Rectangle.NO_BORDER,
                       Colspan = colspan,
                       Rowspan = rowspan,
                       PaddingTop = 1,
                       PaddingBottom = 1,
                       PaddingLeft = 5,
                       PaddingRight = 5,
                       MinimumHeight = minHeight,
                       VerticalAlignment = Element.ALIGN_CENTER
                   };
    }
  

Результатом этого является то, что ни один из методов не печатает текст ячейки.

Я не думаю, что я действительно понимаю, что происходит, когда я создаю объект font, моя цель — иметь возможность определить несколько распространенных шрифтов и базовых свойств (размер, жирный шрифт), которые я затем могу повторно использовать во всем моем классе, однако из моего использования видно, что объект font не может быть сохранен таким образом.

Ответ №1:

Как странно. Они могут и ДОЛЖНЫ быть общими. Все ли символы, которые вы пытаетесь нарисовать, в WinAnsiEncoding (в основном, первые 256 символов Unicode).

Ах! Я подозреваю, что вы можете столкнуться с проблемой выравнивания.

Допустимые настройки для выравнивания по вертикали:

 Element.ALIGN_TOP
Element.ALIGN_MIDDLE
Element.ALIGN_BOTTOM
  

Element.ALIGN_CENTER используется строго для выравнивания по горизонтали. Я не уверен, что из-за этого ваш текст исчезнет, но на это, безусловно, стоит обратить внимание.

PS: Я полагаю, вы даже можете повторно использовать объекты Font и BaseFont в документах, хотя я сам этого не пробовал.