带有iTextsharp

时间:2016-03-10 22:27:18

标签: 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;
        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的链接: https://www.dropbox.com/s/p388bw7egjsbi80/curit_2015_2.pdf?dl=0

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

任何提示都会非常感激。

1 个答案:

答案 0 :(得分:0)

  

我绘制的正方形以显示复选框

您的代码不会绘制任何正方形。

你的代码做了什么,实际上是令人惊讶的,

  • 它创建了许多复选框AcroForm表单字段,没有选中它们,没有一个用方形可视化选择命名,并且
  • 它在页面内容中绘制了一个十字架,表示您似乎想要显示已检查的位置。

因此,即使创建的PDF有效,它也可能会激怒人们,因为他们显然无法取消选择预先选择的条目,只是第二次选择它们会导致两个重叠的交叉。

您的复选框边框仅显示在某些PDF查看器上而不显示在其他PDF查看器上的原因与问题this answer"iText - Java Android - Adding fields to existing pdf"中所述相同:

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

一些PDF观众很早就认识到他们无法正确处理空名字段,因此,甚至不会显示它们,而其他观众在以后尝试保存或发布表单时会认出来,或者不要根本不会识别它,产生破碎的输出。

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