Верхний и нижний колонтитулы в ITextSharp

Я знаю, что этот вопрос задавали тысячу раз, но я так и не нашел прямого ответа. Я относительно новичок в ITextSharp, поэтому, пожалуйста, объясните, как если бы вы разговаривали с малышом. Как я могу добавить простой текстовый верхний и нижний колонтитулы в документ, который я создаю?

Я создаю простой документ PDF со следующим кодом:

void Button1Click(object sender, EventArgs e)
    {

            Document doc = new Document(iTextSharp.text.PageSize.LEDGER, 10, 10, 42, 35);
            PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(@"File Path", FileMode.Create));

            doc.Open();
            Paragraph par1 = new Paragraph("Hello World!");
            doc.Add(par1);

            //Code to add header/footer

            doc.Close();

            MessageBox.Show("Your PDF has been created!");
    }

Я провел много исследований о том, как добавлять верхние и нижние колонтитулы, но все они связаны со сложными событиями страницы. Есть ли более простой способ? Если нет, можете ли вы рассказать мне о процессе шаг за шагом? Я был бы очень признателен за любую помощь, которую вы все можете дать. Спасибо!


person 1Programming1    schedule 27.12.2015    source источник
comment
Вы должны использовать события страницы. Но они не сложные.   -  person mkl    schedule 28.12.2015
comment
Не могли бы вы провести меня через процесс очень быстро?   -  person 1Programming1    schedule 28.12.2015
comment
Удовлетворяет ли вас ответ @ Бруно? Я не знаю, как это лучше объяснить.   -  person mkl    schedule 29.12.2015


Ответы (1)


Вы создаете свой Document следующим образом:

Document doc = new Document(iTextSharp.text.PageSize.LEDGER, 10, 10, 42, 35);

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

На официальном веб-сайте есть множество примеров и обширный раздел вопросов и ответов. Все примеры и ответы помечены. Если щелкнуть тег header, можно найти множество примеров.

Как уже указывалось другими в комментариях, вам необходимо создать реализацию PdfPageEvent. Самый простой способ сделать это — расширить класс PdfPageEventHelper.

class MyHeaderFooterEvent : PdfPageEventHelper {
  Font FONT = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);

  public override void OnEndPage(PdfWriter writer, Document document) {
    PdfContentByte canvas = writer.DirectContent;
    ColumnText.ShowTextAligned(
      canvas, Element.ALIGN_LEFT,
      new Phrase("Header", FONT), 10, 810, 0
    );
    ColumnText.ShowTextAligned(
      canvas, Element.ALIGN_LEFT,
      new Phrase("Footer", FONT), 10, 10, 0
    );
  }
}

Важно знать:

  • Запрещено добавлять контент в событие OnStartPage(). Добавьте верхний и нижний колонтитулы, когда весь контент будет добавлен на страницу непосредственно перед тем, как iTextSharp перейдет на новую страницу. Более конкретно: добавьте контент в событие OnEndPage().
  • Запрещено добавлять контент в объект Document, который передается в событие. Этот объект можно использовать только для чтения.

Если вы изучите метод OnEndPage() в классе MyHeaderFooterEvent, вы увидите, что мы получаем DirectContent от автора и что мы добавляем содержимое в этот canvas с помощью ShowTextAligned методов. Есть много других способов добавить контент, но вы явно попросили самый простой способ. Этот способ имеет свои ограничения, но он прост.

Я использовал пару жестко закодированных значений: я использовал 10 в качестве значения x для верхнего и нижнего колонтитула. Это потому, что вы определили левое поле в 10 пользовательских единиц. Верхний и нижний колонтитулы выровнены по левому краю с фактическим содержимым, которое вы добавляете на страницу. Я использовал 810 для значения y заголовка, потому что вы создаете страницу A4 с верхним полем 42. Верхняя координата y вашей страницы — 842. Верхняя координата y верхнего поля — 842 — 42 = 800. Я добавил 10 пользовательских единиц, чтобы ваш заголовок не был приклеен к реальному контенту. Нижняя y координата страницы равна 0 в вашем случае, а нижняя y координата поля равна 35. Я использовал 10 для базовой линии нижнего колонтитула.

Вы создали wri и сразу после создания этого экземпляра PdfWriter вы открываете экземпляр Document. Чтобы событие страницы вступило в силу, вы должны добавить следующую ссылку прямо перед открытием Document:

wri.PageEvent = new MyHeaderFooterEvent();

Теперь метод OnEndPage() будет вызываться каждый раз, когда ваш основной процесс завершает страницу.

Важно! вы добавили //Code to add header/footer не в то место. iTextSharp попытается сбросить содержимое страницы как можно скорее. Если вы добавите код для добавления верхнего/нижнего колонтитула после добавления контента, вы не сможете вернуться и добавить верхний и нижний колонтитулы на страницы, которые уже были сброшены в выходной поток.

person Bruno Lowagie    schedule 28.12.2015