带有 iTextsharp 的 PDF 复选框

PDF checkboxes with iTextsharp

我有一个 Android 应用程序需要生成一个 PDF 文档,其中包含从数据库中获取的各种数据。一切正常,包括我用这段代码生成的表格和复选框:

    private PdfFormField WriteCheckbox(ref PdfContentByte pcb, float xPos, float yPos, string fldName, bool cbState)
    {
        yPos = yPos - 2f;
        float cbDist = 1f;
        Rectangle cbRect = new Rectangle(xPos, yPos, xPos + DEFAULT_CHECKBOX_SIZE, yPos + DEFAULT_CHECKBOX_SIZE);
        RadioCheckField checkbox = new RadioCheckField(pcb.PdfWriter, cbRect, "", "");
        checkbox.CheckType = RadioCheckField.TYPE_SQUARE;
        checkbox.BorderColor = BaseColor.BLACK;
        checkbox.BorderStyle = PdfBorderDictionary.STYLE_SOLID;
        checkbox.BorderWidth = 0.5f;
        checkbox.FieldName = fldName;

        if(cbState)
        {
            pcb.SetLineWidth(1.2f);
            pcb.MoveTo(xPos + DEFAULT_CHECKBOX_DISTANCE, yPos + cbDist);
            pcb.LineTo(xPos + DEFAULT_CHECKBOX_SIZE - cbDist - 1, yPos + DEFAULT_CHECKBOX_SIZE - cbDist - 1);
            pcb.MoveTo(xPos + DEFAULT_CHECKBOX_SIZE - cbDist - 1, yPos + cbDist);
            pcb.LineTo(xPos + DEFAULT_CHECKBOX_DISTANCE, yPos + DEFAULT_CHECKBOX_SIZE - cbDist - 1);
        }

        pcb.Stroke();

        return(checkbox.RadioField);
    }

生成的 PDF 在平板电脑 (Nexus 7) 上可以正确显示,但是当我将它复制到我的 PC 上并使用 Acrobat 打开时 Reader 除了我要显示的方块外,所有内容都在正确的位置复选框。我可以看到我在方块内画的十字,但看不到周围的方块。发生了什么事?

这是生成的 pdf 的 link: https://www.dropbox.com/s/p388bw7egjsbi80/curit_2015_2.pdf?dl=0

这是 Nexus 7 屏幕截图的 link,显示了完全相同的文件:

如有任何提示,我们将不胜感激。

the squares I draw to show the checkboxes

您的代码没有绘制任何正方形。

你的代码所做的,实际上是令人惊讶的,

  • 它创建了许多复选框 AcroForm 表单字段,其中 none 个已选中,none 个已命名,带有正方形可视化 selection,并且
  • 它在页面内容中您似乎希望显示为选中的位置画了一个十字。

因此即使创建的 PDF 是有效的,它也会激怒人们,因为他们显然无法删除 select 预先 select 编辑的条目,只是 select 他们第二次导致两个重叠的十字架。


您的复选框边框仅出现在某些 PDF 查看器上而不出现在其他查看器上的原因与 to the question 中解释的相同:

AcroForm 表单字段需要有一个非空名称。AcroForm 表单内容要发送到某些服务进行自动评估,因此必须命名它们并且它们必须可以通过各自的名称来区分。

一些 PDF 查看器很早就意识到他们无法正确处理名称为空的字段,因此甚至不显示它们,而其他查看器后来在尝试保存或 post 表单时意识到,或者根本不认识它,产生损坏的输出。


但即使在单独命名框之后,您也应该决定是否要使用 AcroForm 表单域。在前一种情况下,您只需添加正确命名的表单字段并设置它们 selected 或不设置,而在后一种情况下,您将在页面内容中绘制完整的复选框外观(不仅仅是复选标记)而不使用表单字段。