【问题标题】:Duplicate Fields using itextsharp使用 itextsharp 复制字段
【发布时间】:2016-12-29 17:42:08
【问题描述】:

我有这段代码来创建文本字段

public void MssCreateTextField(byte[] ssPdf, RCRectangleRecord ssRectangle, string ssName, int ssFontSize, string ssValue, int ssPage, out byte[] ssPdfOut, bool ssIsMultiline) {

        PdfReader reader = new PdfReader(ssPdf);
        ssPdfOut = null;

        var output = new MemoryStream();
        var stamper = new PdfStamper(reader, output);

        /*TextField tField = new TextField(stamper.Writer, new iTextSharp.text.Rectangle((float)ssRectangle.ssSTRectangle.ssllx, (float)ssRectangle.ssSTRectangle.sslly, (float)ssRectangle.ssSTRectangle.ssurx, (float)ssRectangle.ssSTRectangle.ssury), ssName);




        if (ssValue!="")
            tField.Text = ssValue;

        if (ssIsMultiline)
            tField.Options = TextField.MULTILINE;


         tField.FontSize = ssFontSize;*/

        PdfFormField tField = PdfFormField.CreateTextField(stamper.Writer, ssIsMultiline, false, 50);

        tField.FieldName = ssName;
        tField.SetWidget(new iTextSharp.text.Rectangle((float)ssRectangle.ssSTRectangle.ssllx, (float)ssRectangle.ssSTRectangle.sslly, (float)ssRectangle.ssSTRectangle.ssurx, (float)ssRectangle.ssSTRectangle.ssury), PdfAnnotation.HIGHLIGHT_TOGGLE);



         stamper.FormFlattening = false;
        stamper.AddAnnotation(tField, ssPage);


        stamper.Close();
        reader.Close();

        ssPdfOut = output.ToArray();
    }

如您所见,我将一些代码注释为替代方案,但两种不同的方式产生相同的结果。

我想要实现的是创建两个同名的文本字段,以便在编辑一个时编辑另外两个。这两个代码(在浏览器和 pdfescape 站点中)执行此操作,但在 adobe acrobat 阅读器中除外。在 acrobat 阅读器中,我只看到第一个字段可见,而其他字段隐藏我不知道为什么...

【问题讨论】:

  • 我只看到您的代码创建了一个文本字段,而不是两个字段。
  • 是的,但我调用了两次函数

标签: itext adobe acrobat


【解决方案1】:

如果您想添加两个代表相同内容的文本字段可视化,您必须将它们添加为同一字段的两个小部件并且不是两个不同的字段,例如像这样:

public void CreateDoubleTextField(byte[] ssPdf, Rectangle ssRectangle1, Rectangle ssRectangle2, string ssName, int ssFontSize, string ssValue, int ssPage, out byte[] ssPdfOut, bool ssIsMultiline)
{
    PdfReader reader = new PdfReader(ssPdf);
    ssPdfOut = null;

    var output = new MemoryStream();
    var stamper = new PdfStamper(reader, output);

    PdfFormField tField = PdfFormField.CreateTextField(stamper.Writer, ssIsMultiline, false, 50);
    tField.FieldName = ssName;

    PdfFormField widget1 = PdfFormField.CreateEmpty(stamper.Writer);
    widget1.SetWidget(ssRectangle1, PdfAnnotation.HIGHLIGHT_TOGGLE);
    PdfFormField widget2 = PdfFormField.CreateEmpty(stamper.Writer);
    widget2.SetWidget(ssRectangle2, PdfAnnotation.HIGHLIGHT_TOGGLE);

    tField.AddKid(widget1);
    tField.AddKid(widget2);

    stamper.FormFlattening = false;
    stamper.AddAnnotation(tField, ssPage);

    stamper.Close();
    reader.Close();

    ssPdfOut = output.ToArray();
}

(因为我没有 RCRectangleRecord,所以我使用 iTextSharp Rectangle 类作为参数。)

这为您提供了 Adob​​e Acrobat Reader 中的两个字段可视化;在编辑其中一个并切换焦点(例如单击该可视化之外的某个位置)后,另一个可视化会复制内容。

【讨论】:

  • 你在哪里使用 ssRectangle1?我可以用 TextField 而不是 PdfFormField 来做到这一点吗?我怎样才能按顺序做,而不是所有字段都用同一个方法?
  • “你在哪里使用 ssRectangle1?” - 在widget1.SetWidget(ssRectangle1, PdfAnnotation.HIGHLIGHT_TOGGLE);
  • “我可以用 TextField 代替 PdfFormField 吗?” - TextField 在实现时考虑了单一可视化文本表单字段。因此:不,不是这样。但是你可以考虑将Textfield扩展成一个多可视化文本表单域的类,这是一个很好的基础。
  • “我怎样才能按顺序完成,而不是所有字段都用同一种方法?” - 恐怕不是那么容易,至少在 iTextSharp 5 中你必须深入研究 PDF 结构并使用 iTextSharp 低级 API。
  • 我可以在 acrofields.fields 中按名称进行 foreach 比较并以某种方式转换为 pdfformfield 以添加孩子吗?
【解决方案2】:

现在我有了这个,当列表有多个 Rectangle 时,我可以创建两个字段,但由于某种原因,我不知道这两个字段在没有名称的情况下是如何显示的!!

PdfReader reader = new PdfReader(ssPdf);
        ssPdfOut = null;

        var output = new MemoryStream();
        var stamper = new PdfStamper(reader, output);

        TextField tField;


        if (ssRectangle.Count==1){

            tField= new TextField(stamper.Writer, new iTextSharp.text.Rectangle((float)ssRectangle[0].ssSTRectangle.ssllx, (float)ssRectangle[0].ssSTRectangle.sslly, (float)ssRectangle[0].ssSTRectangle.ssurx, (float)ssRectangle[0].ssSTRectangle.ssury), ssName);
            if (ssValue!="")
            tField.Text = ssValue;

            if (ssIsMultiline)
                tField.Options = TextField.MULTILINE;


             tField.FontSize = ssFontSize;

             tField.FieldName = ssName;

             stamper.AddAnnotation(tField.GetTextField(), ssPage);
        }


        else
        {

            PdfFormField PtField = PdfFormField.CreateTextField(stamper.Writer, ssIsMultiline, false, 250);
            PtField.Name=ssName;
            foreach (RCRectangleRecord item in ssRectangle)
                {
                /*
                    tField=new TextField(stamper.Writer, new iTextSharp.text.Rectangle((float)ssRectangle[0].ssSTRectangle.ssllx, (float)ssRectangle[0].ssSTRectangle.sslly, (float)ssRectangle[0].ssSTRectangle.ssurx, (float)ssRectangle[0].ssSTRectangle.ssury), ssName);
                    tField.FieldName = ssName;
                    PtField.AddKid(tField.GetTextField());*/

                    PdfFormField widget = PdfFormField.CreateEmpty(stamper.Writer);
                    widget.SetWidget(new Rectangle((float)item.ssSTRectangle.ssllx, (float)item.ssSTRectangle.sslly, (float)item.ssSTRectangle.ssurx, (float)item.ssSTRectangle.ssury), PdfAnnotation.HIGHLIGHT_TOGGLE);
                    widget.Name = ssName;
                    PtField.AddKid(widget);
                }

            stamper.AddAnnotation(PtField, ssPage);

        }



        stamper.FormFlattening = false;


        stamper.Close();
        reader.Close();

        ssPdfOut = output.ToArray();

【讨论】:

  • 知道了 PtField.Name=ssName;应该是 PtField.FieldName=ssName;
猜你喜欢
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多