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 пт.