如何将文本添加到我使用iTextSharp创建的复选框中?

时间:2015-04-15 16:24:37

标签: checkbox pdf-generation itextsharp rectangles

根据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,不会产生复选框......

3 个答案:

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