2016-06-27 4 views
0

Добрый день, всем!itextpdf разное поле на конкретной странице

У меня есть некоторые вопросы, касающиеся документа:

  1. ли itextpdf возможность иметь различный запас на конкретной странице? Я пытался использовать

document.setMargin

затем

document.newPage

но мне кажется, что каждая страница получить тот же запас.

  1. Есть ли способ предотвратить перекрытие заголовка и элемента?

Спасибо!

EDIT

Вот метод, который добавляет содержимое документа:

@Override 
    void addDocumentContent(Document doc, PdfWriter writer, AbstractDiplomaDataModel diplomaData) throws DiplomaPdfFileProducerException { 
     try { 
      doc.setMargins(DefaultPdfDocumentSettings.LEFT_MARGIN, DefaultPdfDocumentSettings.RIGHT_MARGIN, 0f, 0f); 
      doc.newPage();   
      doc.add(new DiplomaPdfDataGenerator(diplomaData).generateFirstPagePdf()); 
      doc.setMargins(DefaultPdfDocumentSettings.LEFT_MARGIN, DefaultPdfDocumentSettings.RIGHT_MARGIN, DefaultPdfDocumentSettings.TOP_MARGIN,DefaultPdfDocumentSettings.BOTTOM_MARGIN); 
      doc.newPage();   
      doc.add(new DiplomaPdfDataGenerator(diplomaData).generateOtherPagesPdf()); 
     } catch (Exception e) { 
      throw new DiplomaPdfFileProducerException(e.getMessage()); 
     } 
    } 

и это результат:

title page, margin is changed

overlap

+0

Что такое 'DiplomaPdfDataGenerator.generateFirstPagePdf()' и 'DiplomaPdfDataGenerator.generateOtherPagesPdf()' return? И как вы создаете заголовки? И каковы значения констант 'DefaultPdfDocumentSettings'? Помимо этого код выглядит как код в моем ответе, который работает как ожидалось. Таким образом, что-то особенное об этих объектах или механике. – mkl

+0

Это сработало. ГенерированиеFirstPagePdf() и generateOtherPagesPdf() возвращает элемент/элемент. Я просто не заметил разницы, потому что DefaultPdfDocumentSettings.TOP_MARGIN - 20. Я изменил верхнюю границу на 60, и я заметил разницу – triForce420

+1

Отлично! Я начал задаваться вопросом, что эти методы могут вернуться, чтобы результат проигнорировал поля ...;) – mkl

ответ

5

Я просто попытался, что вы описали:

StringBuilder builder = new StringBuilder("test"); 
for (int i = 0; i < 100; i++) 
    builder.append(" test"); 
String test = builder.toString(); 

try ( OutputStream pdfStream = new FileOutputStream(new File(RESULT_FOLDER, "ChangingMargins.pdf"))) 
{ 
    Document pdfDocument = new Document(PageSize.A4.rotate(), 0, 0, 0, 0); 
    PdfWriter.getInstance(pdfDocument, pdfStream); 
    pdfDocument.open(); 

    for (int m = 0; m < pdfDocument.getPageSize().getWidth()/2; m += 100) 
    { 
     pdfDocument.setMargins(m, m, 100, 100); 
     pdfDocument.newPage(); 
     pdfDocument.add(new Paragraph(test)); 
    } 

    pdfDocument.close(); 
} 

(ChangeMargins.java метод testChangingMargins)

Результат:

Screenshot

Таким образом, учитывая ваш пункт 1: Да, IText могут иметь значение на определенной странице.

ОП задавался в комментарии:

как насчет верхнего и нижнего края?:/

Для этого я изменил цикл выше:

for (int m = 0; m < pdfDocument.getPageSize().getWidth()/2 && m < pdfDocument.getPageSize().getHeight()/2; m += 100) 
    { 
     pdfDocument.setMargins(m, m, m, m); 
     pdfDocument.newPage(); 
     pdfDocument.add(new Paragraph(test)); 
    } 

и результат:

Screenshot

Таким образом, различные верхнего и нижнего полей работы, тоже.


Учитывая ваш вопрос 2 ли там какой-нибудь способ, чтобы предотвратить заголовок и элемент из перекрывающихся: Обычно они не перекрывают друг друга.

+0

как насчет верхнего и нижнего полей? :/ – triForce420

+0

Cf. мое редактирование, после того, как явное изменение изменения вертикальных полей тоже. – mkl

+0

Я отредактировал мое сообщение, чтобы добавить строку кода и снимок экрана о том, что происходит после добавления контента – triForce420

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