根据Jeff S&#39}发现的方法,我可以添加一个" Checkbox"到这样的PDF页面:
PdfPTable tblFirstRow = new PdfPTable(5);
tblFirstRow.SpacingBefore = 4f;
tblFirstRow.HorizontalAlignment = Element.ALIGN_LEFT;
. . . // code where textboxes are added has been elided for brevity
PdfPCell cell204Submitted = new PdfPCell()
{
CellEvent = new DynamicCheckbox("checkbox204Submitted", "204 Submitted or on file")
};
tblFirstRow.AddCell(cell204Submitted);
doc.Add(tblFirstRow);
基于Jeff S的CustomCellLayout类的DynamicCheckbox类是:
public class DynamicCheckbox : IPdfPCellEvent
{
private string fieldname;
private string cap;
public DynamicCheckbox(string name, String caption)
{
fieldname = name;
cap = caption;
}
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.Text = cap;
PdfFormField field = ckbx.CheckField;
writer.AddAnnotation(field);
}
}
我的问题是没有显示复选框的文本(分配给ckbx.Text的字符串)。复选框(超大)占据表格行中的最后一个单元格,但没有(可见)伴随文本。
我的代码中缺少什么?
注意:我尝试通过这样做来减小复选框的大小:
Rectangle tangle = new Rectangle(20, 20);
//RadioCheckField ckbx = new RadioCheckField(writer, rectangle, fieldname, "Yes");
RadioCheckField ckbx = new RadioCheckField(writer, tangle, fieldname, "Yes");
...但是那次尝试失败了 - 通过该代码,我甚至无法找到"生成的PDF文件中的复选框 - 在第5列中单击willy-nilly,不会产生复选框......
答案 0 :(得分:2)
其他人已经回答了标签部分。您调用的矩形"纠结"需要从进入事件处理程序的矩形计算,类似于
Rectangle tangle = new Rectangle(
rectangle.Left,
rectangle.Top - PDFStyle.boxsize - 4.5f,
rectangle.Left + PDFStyle.boxsize,
rectangle.Top - 4.5f
);
其中PDFStyle.boxsize是复选框的宽度/高度,4.5f是填充单元格边缘的位置。基本上矩形不是相对于单元格,而是相对于页面是绝对的。
答案 1 :(得分:1)
如ISO-32000-1中所述,复选框是Button类型的字段。如果为按钮定义文本,则需要定义按钮上显示的文本。但是:如果是复选框,则没有此类文本!相反,您有两个外观,一个用于Off
值,另一个用于Yes
值。
细心的读者做出的有根据的猜测是,您不想添加文本(按钮),但是您想要添加标签(对于一个复选框)。您应该再次咨询ISO-32000-1,并且您发现该规范没有说明复选框标签的任何内容。这个概念并不存在于AcroForm的层面。
这并不意味着概念一般不存在。许多PDF工具允许您定义以标签开头的复选框。当您查看PDF时,您会发现此标签只是内容的一部分,而复选框则由窗口小部件方向表示。
让我们看看官方文档,而不是在网上的每个地方搜索,除了在官方网站上。更具体地说:让我们看一下本书第7章中的Buttons示例。您会看到可以为真实按钮设置文字:
PushbuttonField button = new PushbuttonField(writer, rect, "Buttons");
button.setText("Push me");
这不可能带有复选框(显然原因是复选框的外观完全不同)。如果我们想要添加标签,我们可以添加它,例如:
checkbox = new RadioCheckField(writer, rect, LANGUAGES[i], "Yes");
field = checkbox.getCheckField();
field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Off", onOff[0]);
field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Yes", onOff[1]);
writer.addAnnotation(field);
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,
new Phrase(LANGUAGES[i], font), 210, 790 - i * 40, 0);
您可以在此处找到这些示例的C#版本:http://tinyurl.com/itextsharpIIA2C07
答案 2 :(得分:1)
创建一个复选框,然后在右边附带文本,可以这样做:
PdfPCell cell204Submitted = new PdfPCell()
{
CellEvent = new DynamicCheckbox("checkbox204Submitted")
};
tblFirstRow.AddCell(cell204Submitted);
// . . . Chunks and an anchor created; that code has been elided for brevity
Paragraph parCkbxText = new Paragraph();
parCkbxText.Add(Chunk204SubmittedPreamble);
parCkbxText.Add(ChunkBoldNote);
parCkbxText.Add(Chunk204Midsection);
parCkbxText.Add(anchorPayeeSetup204);
PdfPCell cellCkbxText = new PdfPCell(parCkbxText);
cellCkbxText.BorderWidth = PdfPCell.NO_BORDER;
tblFirstRow.AddCell(cellCkbxText);
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 = BaseColor.ORANGE;
ckbx.FontSize = 6;
ckbx.TextColor = BaseColor.WHITE;
PdfFormField field = ckbx.CheckField;
writer.AddAnnotation(field);
}
}