Android 带有iTextsharp的PDF复选框

Android 带有iTextsharp的PDF复选框,android,pdf,itextsharp,Android,Pdf,Itextsharp,我有一个Android应用程序,需要生成一个PDF文档,其中包含从数据库获取的各种数据。一切正常,包括表和复选框,我用这段代码生成: private PdfFormField WriteCheckbox(ref PdfContentByte pcb, float xPos, float yPos, string fldName, bool cbState) { yPos = yPos - 2f; float cbDist = 1f;

我有一个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上并打开if with Acrobat Reader时,所有内容都位于正确的位置,除了我绘制的用于显示复选框的方块。我可以在正方形内画十字,但不能画周围的正方形。发生了什么事

这是指向生成的pdf的链接:

这是指向Nexus 7屏幕截图的链接,显示了非常相同的文件:

任何暗示都将不胜感激

我画的方块显示复选框

你的代码没有画任何正方形

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

  • 它创建了许多复选框表单字段,其中没有一个选中,没有一个命名,带有方形可视化选择,以及
  • 它会在页面内容中您希望选中的位置画一个十字
因此,即使创建的PDF是有效的,也可能会激怒人们,因为他们显然无法取消选择预先选择的条目,只需再次选择它们,从而导致两个交叉重叠


复选框边框仅出现在某些PDF查看器上而不出现在其他查看器上的原因与问题的中所述的相同:

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

一些PDF查看者很早就意识到他们无法正确处理空名称的字段,因此,他们甚至不显示这些字段,而其他查看者在稍后尝试保存或发布表单时意识到这一点,或者根本无法识别表单,从而产生了不正确的输出



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

您的标记是错误的。iTextSharp是C#的缩写。我想你指的是文本。我不知道最简单的解决办法是自己画复选框。实际上,我不需要用户与文档交互,因为它只是最终文档的预览(用于热发生器的报告控件)。PDF能够直接在文档上放置复选框对象,在我看来这是最明显的解决方案,因此我四处搜索任何提示,并找到了一些AcroForm示例@amedee,《标签》报道了c#和iTextSharp,因为(很抱歉没有提及)我正在与Xamarin合作。