Создание зачеркнутого шрифта с помощью iText 7 (C #) - PullRequest
0 голосов
/ 08 мая 2018

Я обновляю проект C # для использования iText 7 и собираюсь добавить эффект зачеркивания к значению, установленному в поле формы. Изначально в коде использовалась старая версия iTextSharp , что сделало довольно интуитивно понятным создание зачеркнутого шрифта:

// older iTextSharp code
Font strikethruFont = new Font(normalBase, 11f, Font.STRIKETHRU);

Однако я не могу найти примеры или документацию о том, как 1) создать шрифт с зачеркиванием, как указано выше, с помощью iText 7 и использовать его в поле формы, или 2) использовать какой-либо другой инструмент ( PdfCanvas, Tables, Text объекты и т. Д.), Чтобы добавить стиль в поле формы перед установкой его значения.

// somehow create a strikethrough font
PdfFont strikethruFont = ???

PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);

form.GetField("Some Field Name")
    .SetValue("Some content to strike through", strikethruFont, 11f)

Примечание. Я видел примеры использования объекта Text с подчеркиванием с отрицательным смещением по оси Y (эффективное вытягивание подчеркивания в текстовую область, имитирующее зачеркивание). К сожалению, Text объекты не могут использоваться с form.SetValue().

1 Ответ

0 голосов
/ 10 мая 2018

Единственный способ имитировать зачеркивание - рисовать линии в PDF с помощью объекта PdfCanvas. Это не чистый подход, и я надеюсь, что сотрудники iText7 будут работать над улучшением своей документации, но я включу мой обходной путь здесь, надеясь, что он поможет кому-то бороться с подобной проблемой.

// set the form field value per normal
form.GetField(fieldName)
    .SetValue(fieldValue);

// draw a line exactly in the middle of the form field
Rectangle fieldFormArea = form.GetField(fieldName)
                              .GetWidgets()
                              .First()
                              .GetRectangle()
                              .ToRectangle();

float fieldWidth = fieldFormArea.GetWidth();
float fieldHeight = fieldFormArea.GetHeight();
float bottomLeftX = fieldFormArea.GetX();
float bottomLeftY = fieldFormArea.GetY();

PdfCanvas canvas = new PdfCanvas(form.GetPdfDocument().GetFirstPage());

// Approach A: put a line through the whole width of the field
canvas.MoveTo(bottomLeftX, bottomLeftY + (fieldHeight / 2));
canvas.LineTo(bottomLeftX + fieldWidth, bottomLeftY + (fieldHeight / 2))
      .SetLineWidth(0.75f)
      .ClosePathStroke();

// Approach B: put a line that covers just the text in the field
PdfFont font = PdfFontFactory.CreateFont(FontConstants.TIMES_ROMAN);
PdfString content = new PdfString(fieldValue);
// assumes size 11 text
float textWidth = (font.GetContentWidth(content) * 11) / 1000.0f;

// then use textWidth in place of fieldWidth in Approach A above
...