iTextSharp - 移动Acrofield

时间:2014-03-07 19:05:33

标签: c# .net itextsharp acrofields

我有一个将内容表插入现有Acroform的流程,并且我能够跟踪启动该内容所需的位置。但是,根据我插入的表的高度,我在该点之下存在需要向上或向下移动的Acrofield。有了这个,我怎样才能改变Acrofield的位置?下面是我可以用来“获得”位置的代码......但现在我还需要能够“设置”它。

...

            // Initialize Stamper ("output" is a MemoryStream object)
            PdfStamper stamper = new PdfStamper(pdf_rdr, output);

            // Get Reference to PDF Document Fields
            AcroFields fields = stamper.AcroFields;

            //call method to get the field's current position
            AcroFields.FieldPosition pos = GetFieldPosition(fields, "txt_footer");

// **需要明确地为这里的田地设定一个新的位置

            //assuming a call to "RegenerateField" will be required
            fields.RegenerateField(txt_footer);

...

    //helper method for capturing the position of a field
    private static AcroFields.FieldPosition GetFieldPosition(AcroFields fields, string field_nm)
    {

        ////////////////////////////////////////////////////////////////////////////////////
        //get the left margin of the page, and the "top" location for starting positions
        //using the "regarding_line" field as a basis
        IList<AcroFields.FieldPosition> fieldPositions = fields.GetFieldPositions(field_nm);

        AcroFields.FieldPosition pos = fieldPositions[0];

        return pos;

    }

1 个答案:

答案 0 :(得分:6)

首先是一些关于字段及其在一个或多个页面上的表示的信息。 PDF表单可以包含许多字段。字段具有唯一名称,因为具有一个特定名称的一个特定字段具有一个和一个值。字段使用字段字典定义。

每个字段在文档中可以包含零个,一个或多个表示。这些可视化表示称为小部件注释,它们使用注释字典定义。

了解这一点,您的问题需要重新说明:如何更改特定字段的特定窗口小部件注释的位置?

我在Java中使用名为ChangeFieldPosition的样本来回答这个问题。您可以将它移植到C#(也许您可以在此处发布C#答案以供进一步参考)。

您已拥有AcroFields个实例:

 AcroFields form = stamper.getAcroFields();

您现在需要的是特定字段的Item实例(在我的示例中:对于名称为"timezone2"的字段):

    Item item = form.getFieldItem("timezone2");

该位置是窗口小部件注释的属性,因此您需要向item询问其小部件。在下一行中,我获取第一个窗口小部件注释的注释字典(索引为0):

    PdfDictionary widget = item.getWidget(0);

在大多数情况下,只有一个窗口小部件注释:每个字段只有一个可视化表示。

注释的位置是一个包含四个值的数组:llx,lly,urx和ury。我们可以这样得到这个数组:

    PdfArray rect = widget.getAsArray(PdfName.RECT);

在以下行中,我更改了右上角的x值(索引2与urx对应):

    rect.set(2, new PdfNumber(rect.getAsNumber(2).floatValue() - 10f));

结果,场的宽度缩短了10pt。