如何使用 iTextSharp 创建按钮以添加到 PDF 文件?
How can I create buttons to add to a PDF file using iTextSharp?
我正在使用 iTextSharp 创建 "labels" 以及文本框和复选框,但我尝试从该代码派生来创建按钮尚未成功。
下面是我创建文本框的方式:
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);
}
}
最后一个(按钮)代码中有什么缺失或错误?我在想我在 DynamicButton.CellLayout() 中对 "field" 的赋值一定是错误的,但它应该是什么?
下面是 "buttons" 的外观(底部的细长线条,位于复选框及其关联的 text/label 下方):
我怎样才能丰满up/hydrate那些细枝"buttons"?
您没有展示代码中最重要的部分:您没有展示如何创建为其定义按钮的单元格。如果您检查 rect
的值(更具体地说是它的高度),您会发现您可能正在创建高度为 0
的单元格。为什么高度为零?因为它们可能不包含任何东西。
一个单元格必须包含任何东西吗?当然不是,但是如果你想避免高度为零的行,你必须定义一个高度。 Chapter 4 of my book, for instance in the CellHeights 示例中对此进行了解释。我为这个相当神秘的名字道歉,但这个例子是关于单元格的高度。
您可以定义固定高度:
cell.FixedHeight = 72f;
这很危险属性:如果您添加的内容不适合固定高度(例如 72 个用户单位),该内容将会丢失。
您还可以定义最小高度:
cell.MinimumHeight = 36f;
在这种情况下,高度肯定是 36 个用户单位(在这种情况下),但如果内容多于最小高度,则可能会更多。
我正在使用 iTextSharp 创建 "labels" 以及文本框和复选框,但我尝试从该代码派生来创建按钮尚未成功。
下面是我创建文本框的方式:
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);
}
}
最后一个(按钮)代码中有什么缺失或错误?我在想我在 DynamicButton.CellLayout() 中对 "field" 的赋值一定是错误的,但它应该是什么?
下面是 "buttons" 的外观(底部的细长线条,位于复选框及其关联的 text/label 下方):
我怎样才能丰满up/hydrate那些细枝"buttons"?
您没有展示代码中最重要的部分:您没有展示如何创建为其定义按钮的单元格。如果您检查 rect
的值(更具体地说是它的高度),您会发现您可能正在创建高度为 0
的单元格。为什么高度为零?因为它们可能不包含任何东西。
一个单元格必须包含任何东西吗?当然不是,但是如果你想避免高度为零的行,你必须定义一个高度。 Chapter 4 of my book, for instance in the CellHeights 示例中对此进行了解释。我为这个相当神秘的名字道歉,但这个例子是关于单元格的高度。
您可以定义固定高度:
cell.FixedHeight = 72f;
这很危险属性:如果您添加的内容不适合固定高度(例如 72 个用户单位),该内容将会丢失。
您还可以定义最小高度:
cell.MinimumHeight = 36f;
在这种情况下,高度肯定是 36 个用户单位(在这种情况下),但如果内容多于最小高度,则可能会更多。