Я попробовал ваш пример, и я был удивлен, что я мог воспроизвести вашу проблему.
Я просмотрел код iText и вижу, что явно запрещено изменять значение /T
. Это имеет смысл: если вы хотите заменить существующую кнопку, вы не хотите менять ее имя.
Однако по какой-либо причине мы также явно запрещаем изменять значение /Rect
. Смотрите код AcroFields
класса:
for (Object element : button.getKeys()) {
PdfName key = (PdfName)element;
if (key.equals(PdfName.T) || key.equals(PdfName.RECT))
continue;
if (key.equals(PdfName.FF))
values.put(key, button.get(key));
else
widgets.put(key, button.get(key));
merged.put(key, button.get(key));
markUsed(values);
markUsed(widgets);
}
Я не знаю, почему мы приняли такое решение, когда мы писали этот код. Если я удалю || key.equals(PdfName.RECT)
, тогда ваш код работает так, как ожидалось.
Поскольку мы сознательно исключили изменение размеров кнопки, я сомневаюсь, что это ошибка или мы намеренно добавили этот код там. Читая ваше требование, я склонен удалить || key.equals(PdfName.RECT)
с официального исходного кода.
PS: Я знаю, что это не отвечает на ваш вопрос, но это объясняет, почему ваш код не работает, несмотря на то, что он выглядит отлично. Как я объяснил: Я очень удивлен, что он не работает, потому что я ответственен за код IText ...
PS 2: Я изменил код в официальном trunk.
FYI: изменение, которое было сделано для решения вашей проблемы, теперь выпущено: http://itextpdf.com/changelog/554 –