2015-02-09 2 views
0

Я добавил текстовое поле с несколькими детьми, как описано here. Это использовало функцию автозаполнения PDF ... Теперь мой вопрос в том, как я могу удалить ссылку на страницу из родительского элемента? Поле данных не должно содержать родительскую ссылку, поскольку оно не связано ни с одной страницей. Виджеты должны содержать те (которые я добавил, однако я не могу удалить страницу ссылки родителя/P)Удалить ссылку на страницу из аннотации

Я попытался

PdfFormField parent = PdfFormField.createTextField(stamper.getWriter(), false, false, 0); 
parent.setFieldName(fieldName); 

for (int page = 1; page <= pages; page++) { 
    TextField textField = new TextField(stamper.getWriter(), new Rectangle(560, 600, 590, 800), null); 

    PdfFormField pff = textField.getTextField(); 
    parent.addKid(pff); 
    // add widget to each page 
    pff.setPlaceInPage(page); 
    //iText workarounds 
    field.put(PdfName.P, stamper.getWriter().getPageReference(page)); 
    field.remove(PdfName.FF); 
    field.remove(PdfName.FT); 
} 
//in addAnnotation() the page reference is written 
stamper.addAnnotation(parent, 1); 
//does not work 
parent.remove(PdfName.P); 

однако это не сработало, так как я предполагаю, что эталонная страница уже написано. Есть ли способ удалить его потом?

ответ

1

Факт 1:

PdfFormField класса расширяет PdfAnnotation класса, потому что в большинстве случаев, можно объединить словарь поля с словарем аннотаций.

В вашем случае у вас есть PdfFormField, который используется как иерархический элемент, и хотя этот элемент также является экземпляром PdfAnnotation, это не так. Вы можете проверить это, используя метод isAnnotation(). Он вернет false.

Факт 2:

При добавлении аннотации к существующему PDF, вы должны использовать PdfStamperaddAnnotation() метод «ы, что не только принимает объект аннотаций, но и номер страницы. Если вы не добавили номер страницы, PdfStamper не знал, где добавить аннотацию.

При добавлении настоящей аннотации PdfStamper добавит ключ /P, который ссылается на страницу, где визуализируются аннотации.

Факт 3:

Там нет другого пути, чем при использовании addAnnotation() с аннотацией и номер страницы при работе с PdfStamper. Когда вы добавляете объект PdfFormField, который не является реальной аннотацией, он не будет обрабатываться по-разному, поэтому будет добавлена ​​запись /P, хотя это не имеет смысла (как вы правильно указываете в своем вопросе).

Факт 4:

/P запись не является обязательной. Для корректного отображения аннотаций виджета достаточно, чтобы они отображались на странице /Annots.

Вывод:

IText не следует добавить /P записи в случае, если добавить PdfFormField, который не является реальными аннотациями. Поэтому я не совершил следующее изменение: revision 6756

 void addAnnotation(PdfAnnotation annot, int page) { 
-  annot.setPage(page); 
+  if (annot.isAnnotation()) 
+   annot.setPage(page); 
     addAnnotation(annot, reader.getPageN(page)); 
    } 

Я испытал это с AddFieldAndKids примера и, кажется, получилось: /P запись больше не добавляется.

Это позволяет решить вашу проблему более надежным способом. Вы не должны пытаться удалить что-то, что не должно было быть добавлено в первую очередь.

+0

Согласен - спасибо за патч. – Lonzak

Смежные вопросы