如何向使用 iTextSharp 创建的复选框添加文本?

How can I add text to a Checkbox I create using iTextSharp?

根据发现的 Jeff S 的方法 here,我可以将 "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 class 的 DynamicCheckbox class 是:

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 的字符串)没有显示。复选框(超大)占据了 table 行的最后一个单元格,但没有(可见的)伴随文本。

我的代码缺少什么?

注意:我试图通过这样做来减小复选框的大小:

Rectangle tangle = new Rectangle(20, 20);
//RadioCheckField ckbx = new RadioCheckField(writer, rectangle, fieldname, "Yes");
RadioCheckField ckbx = new RadioCheckField(writer, tangle, fieldname, "Yes");

...但是尝试失败了 - 使用该代码,我什至无法 "find" 生成的 PDF 文件中的复选框 - 在第 5 列中随意单击不会显示任何复选框...

如 ISO-32000-1 中所述,复选框是 Button 类型的字段。如果您为按钮定义文本,则您希望定义按钮上显示的文本。但是:在复选框的情况下,没有这样的文字!相反,您有两种外观,一种用于 Off 值,一种用于 Yes 值。

细心的 reader 做出的有根据的猜测是您不想添加 text(到按钮),但您想添加一个 label(用于复选框)。您应该再次查阅 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

创建一个复选框,然后在其右侧添加文本,可以这样完成:

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);
    }
}

其他人已经回答了标签部分。您称为 "tangle" 的矩形需要根据进入事件处理程序的矩形进行计算,类似于

Rectangle tangle = new Rectangle(
            rectangle.Left,
            rectangle.Top - PDFStyle.boxsize - 4.5f,
            rectangle.Left + PDFStyle.boxsize,
            rectangle.Top - 4.5f
        );

其中PDFStyle.boxsize是复选框的width/height,4.5f是单元格边缘的填充。基本上矩形不是相对于单元格,而是绝对相对于页面。