Как создать кнопки для добавления в файл PDF с помощью iTextSharp?

Я создаю "метки", а также текстовые поля и флажки с помощью iTextSharp, но мои попытки получить этот код для создания кнопок пока не увенчались успехом.

Вот как я создаю текстовые поля:

PdfPCell cellRequesterNameTextBox = new PdfPCell()
{
    CellEvent = new DynamicTextbox("textBoxRequesterName")
};
tblFirstRow.AddCell(cellRequesterNameTextBox);

. . .

public class DynamicTextbox : IPdfPCellEvent
{
    private string fieldname;

    public DynamicTextbox(string name)
    {
        fieldname = name;
    }

    public void CellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases)
    {
        PdfWriter writer = canvases[0].PdfWriter;

        float textboxheight = 11f;
        Rectangle rect = rectangle;
        rect.Bottom = rect.Top - textboxheight;

        TextField text = new TextField(writer, rect, fieldname);

        PdfFormField field = text.GetTextField();

        writer.AddAnnotation(field);
    }
}

И вот как я создаю флажки:

PdfPCell cell204Submitted = new PdfPCell()
{
    CellEvent = new DynamicCheckbox("checkbox204Submitted")
};
tblLastRow.AddCell(cell204Submitted);
. . .

public class DynamicCheckbox : IPdfPCellEvent
{
    private string fieldname;

    public DynamicCheckbox(string name)
    {
        fieldname = name;
    }

    public void CellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases)
    {
        PdfWriter writer = canvases[0].PdfWriter;
        RadioCheckField ckbx = new RadioCheckField(writer, rectangle, fieldname, "Yes");
        ckbx.CheckType = RadioCheckField.TYPE_CHECK;
        ckbx.BackgroundColor = new BaseColor(255, 197, 0);
        ckbx.FontSize = 6;
        ckbx.TextColor = BaseColor.WHITE;
        PdfFormField field = ckbx.CheckField;
        writer.AddAnnotation(field);
    }
}

И вот как я пытаюсь создать кнопки:

PdfPCell cellButton1 = new PdfPCell()
{
    CellEvent = new DynamicButton("button1")
};
tblButtonRow.AddCell(cellButton1);
. . .

public class DynamicButton : IPdfPCellEvent
{
    private string fieldname;

    public DynamicButton(string name)
    {
        fieldname = name;
    }

    public void CellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases)
    {
        PdfWriter writer = canvases[0].PdfWriter;

        float buttonheight = 24f;
        Rectangle rect = rectangle;
        PushbuttonField btn = new PushbuttonField(writer, rect, fieldname);

        PdfFormField field = btn.Field; // <= what should this be?

        writer.AddAnnotation(field);
    }
}

Чего не хватает или что не так в последнем (кнопочном) коде? Я думаю, что мое назначение "field" в DynamicButton.CellLayout() должно быть неправильным, но что это должно быть?

Вот как выглядят "кнопки" (длинные тонкие линии внизу под флажком и связанный с ним текст / метка):

введите описание изображения здесь

Как я могу увеличить / увлажнить эти пуговицы?

1 ответ

Решение

Вы не показываете самую важную часть кода: вы не показываете, как вы создаете ячейки, для которых вы определяете кнопки. Если бы вы проверили значение rect (точнее его высота), вы обнаружите, что вы, вероятно, создаете ячейки с высотой, которая 0, Почему высота ноль? Потому что они, вероятно, ничего не содержат.

Нужно ли в клетке что-то содержать? Конечно нет, но если вы хотите избежать строки с нулевой высотой, вы должны определить высоту. Это объясняется в главе 4 моей книги, например, в примере CellHeights. Я прошу прощения за довольно загадочное имя, но этот пример о высоте клеток.

Вы можете определить фиксированную высоту:

cell.FixedHeight = 72f;

Это опасное свойство: если вы добавляете контент, который не помещается внутри фиксированной высоты (например, 72 пользовательских модуля), этот контент будет потерян.

Вы также можете определить минимальную высоту:

cell.MinimumHeight = 36f;

В этом случае высота, безусловно, будет 36 пользовательских единиц (в данном случае), но может быть больше, если в минимальной высоте больше контента, чем умещается.

Другие вопросы по тегам