【问题标题】:How can I add text to a Checkbox I create using iTextSharp?如何向使用 iTextSharp 创建的复选框添加文本?
【发布时间】:2015-04-15 16:24:36
【问题描述】:

源自 Jeff S 的方法 here,我可以向 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);

DynamicCheckbox 类,基于 Jeff S 的 CustomCellLayout 类,是:

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 列中随意点击不会出现任何复选框...

【问题讨论】:

    标签: checkbox pdf-generation itextsharp rectangles


    【解决方案1】:

    其他人已经回答了标签部分。您称为“tangle”的矩形需要从进入事件处理程序的矩形中计算出来,类似于

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

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

    【讨论】:

    • 事实证明,在我的情况下,保持默认矩形工作正常。试图通过用一个新的矩形替换矩形来“弄乱”这些值,只是把事情弄歪了。也许这是因为矩形是连续的第一件事?我不知道...
    【解决方案2】:

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

    细心的读者做出的有根据的猜测是,您不想添加 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

    【讨论】:

    • 哪个例子与复选框有关?
    • 您提出问题所需的时间,等于您自己找到答案所需的时间(稍加努力):sourceforge.net/p/itextsharp/code/HEAD/tree/book/…
    • Touche 但这对我想要实现的目标不起作用。它依赖于 Ionic 之一。我将单独发布问题。
    • 我在这里添加了问题。快把我逼疯了:stackoverflow.com/q/43294968/388267
    • 对 Ionic 的依赖无关紧要。如果您不使用生成的 PDF 创建 ZIP 文件,则实际上并不需要它。我看了你的问题。我知道您已将其删除,但我的声誉很高,可以看到已删除的问题。您的代码中没有任何对复选框的引用。我的假设是你不想创建一个表单,只显示一个复选框。
    【解决方案3】:

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

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

    【讨论】:

    • 没有调用 CellLayout
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2017-06-11
    • 2014-02-23
    相关资源
    最近更新 更多