2016-06-22 4 views
1

Мы смогли добавить PdfFormField в определенном месте на странице, используя следующий фрагмент кода Scala.Как добавить PdfFormField с помощью IText 7 в текущей позиции страницы

val form = PdfAcroForm.getAcroForm(document.getPdfDocument(), true) 
val nameField = PdfFormField.createText(document.getPdfDocument(), new Rectangle(data.x, data.y, data.width, data.height), data.formName, data.formText) 
form.addField(nameField) 

Однако то, что мы хотели бы быть в состоянии сделать, это добавить его после того, как последний абзац на странице, что мы вставили. (т. е. это поле появляется непосредственно после). Есть ли способ, которым мы можем получить правильный прямоугольник, или есть более простой способ? Thanks

ответ

2

В настоящее время нет готового способа добавления полей в макет, но команда iText рассматривает возможность реализации этой функции.

Между тем, есть простые способы достижения вашей цели, и есть несколько из них.

Мои примеры будут на Java, но я предполагаю, что вы с легкостью сможете их использовать в Scala.

Первый подход заключается только в том, чтобы получить нижнюю позицию абзаца, добавленного вами, и добавить свое поле в отношении этой позиции. Нижнее положение последнего абзаца случается верхнее расположение остальных доступного поля контента на странице (область), которая преобразуется в следующем код:

Document doc = new Document(pdfDoc); 
doc.add(new Paragraph("This is a paragraph.\nForm field will be inserted after it")); 

Rectangle freeBBox = doc.getRenderer().getCurrentArea().getBBox(); 
float top = freeBBox.getTop(); 
float fieldHeight = 20; 
PdfTextFormField field = PdfFormField.createText(pdfDoc, 
      new Rectangle(freeBBox.getLeft(), top - fieldHeight, 100, fieldHeight), "myField", "Value"); 
form.addField(field); 

части вы заинтересованы в том,

Rectangle freeBBox = doc.getRenderer().getCurrentArea().getBBox(); 

который дает вам прямоугольник, где содержимое еще не размещено.

Обратите внимание, однако, что этот подход не повлияет на следующие абзацы после того, как вы захотите добавить поле формы, что означает, что это поле формы и содержимое могут перекрываться.

Успокойтесь в этой ситуации, вы можете воспользоваться возможностью создания пользовательских элементов макета в iText7.

Который, в свою очередь, преобразуется в следующий код:

private static class TextFieldRenderer extends DivRenderer { 
    public TextFieldRenderer(TextFieldLayoutElement modelElement) { 
     super(modelElement); 
    } 

    @Override 
    public void draw(DrawContext drawContext) { 
     super.draw(drawContext); 
     PdfAcroForm form = PdfAcroForm.getAcroForm(drawContext.getDocument(), true); 
     PdfTextFormField field = PdfFormField.createText(drawContext.getDocument(), 
       occupiedArea.getBBox(), "myField2", "Another Value"); 
     form.addField(field); 
    } 
} 

private static class TextFieldLayoutElement extends Div { 
    @Override 
    public IRenderer getRenderer() { 
     return new TextFieldRenderer(this); 
    } 
} 

Тогда вам просто нужно добавить элементы в причудливом образом:

doc.add(new Paragraph("This is another paragraph.\nForm field will be inserted right after it.")); 
doc.add(new TextFieldLayoutElement().setWidth(100).setHeight(20)); 
doc.add(new Paragraph("This paragraph follows the form field")); 

Короче говоря, что мы имеем что мы создали пользовательский фиктивный элемент Div (который является аналогом div в HTML), который будет занимать область во время выкладки, но мы определили пользовательский оператор #draw() для этого элемента, чтобы поле формы вставлялось прямо, когда мы знаем точное где мы хотим это сделать.

Вы можете найти полный код образца here. Обратите внимание, однако, что ссылка может измениться, поскольку репозиторий образцов сейчас находится в процессе реорганизации.