iTextSharp - переместить Акрофилд

У меня есть процесс, который вставляет таблицу содержимого в существующую Acroform, и я могу отслеживать, где мне нужно запустить этот контент. Тем не менее, у меня есть существующие поля Acrofields ниже этой точки, которые нужно будет перемещать вверх или вниз в зависимости от высоты вставляемых таблиц. С этим, как я могу изменить положение 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 ответ

Решение

Сначала немного информации о полях и их представлении на одной или нескольких страницах. Форма 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));

В результате ширина поля сокращается на 10 пт.

Другие вопросы по тегам