2013-03-06 2 views
0

Мне нужно создать большое количество различных типов документов, используя библиотеку itextsharp, у всех есть общие черты, у некоторых есть общие заголовки, подсчеты страниц, водяные знаки, которые у меня начались, чтобы иметь разные подклассы PdfPageEventHelper, например WatermarkPdfPageEventHelper, OrderHeaderPdfPageEventHelper, PageNumberPdfPageEventHelper и т. д. и применять их при необходимости для компоновки документов, но PageEvent - это не событие, а экземпляр только одного IPdfEvent, каков правильный способ его реализации?Как ввести несколько экземпляров PdfPageEventHelper?

ответ

1

Я являюсь автором Java-версии iText. Мой ответ может быть неприменим к порту C#.

Страница событие может быть кумулятивным:

writer.setPageEvent(watermarkevent); 
writer.setPageEvent(headerevent); 
writer.setPageEvent(footerevent); 

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

Когда вы хотите удалить события, вам просто нужно сделать, это:

writer.setPageEvent(null); 

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

Я уверен, что вы можете сделать то же самое в iTextSharp, хотя могут быть небольшие различия в именах классов и методов.

+0

Это решение, которое я искал, спасибо. Объект PageEvent не очень интуитивно понятен. В версии библиотеки C# это свойство, а не метод, поэтому вы ожидаете, что будете иметь ссылку на экземпляр IPdfPageEvent – Marc

0

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

Во-первых, создать свой собственный колонтитул:

public class CustomFooter : PdfPageEventHelper 
{ 
    private string[] _Phrases; 
    private Font _CustomFooterFont; 


    public string[] phrases 
    { 
     get { return _Phrases; } 
     set { _Phrases = value; } 
    } 

    public Font customFont { 
     get { return _CustomFooterFont; } 
     set { _CustomFooterFont = value; } 
    } 



    public override void OnEndPage(PdfWriter writer, iTextSharp.text.Document document) 
    { 
     base.OnEndPage(writer, document); 

     iTextSharp.text.Rectangle rect = writer.GetBoxSize("footer"); 

     for (int i = 0; i < this.phrases.Length; i++) 
     { 
      Phrase currentPhrase; 
      currentPhrase = new Phrase(_Phrases[i], _CustomFooterFont); 

      ColumnText.ShowTextAligned(writer.DirectContent, 
       iTextSharp.text.Element.ALIGN_LEFT, currentPhrase, 
       rect.Left, rect.Bottom +20 - (i * 9), 0); 
     } 
    } 

    } 

При необходимости один из этих колонтитулы, я бы назвал эту функцию:

public static CustomFooter getMultilineFooter(string[] Phrases) 
    { 
     CustomFooter result = new CustomFooter(); 

     result.phrases = Phrases; 
     result.customFont = myCustomFooterFont; 
     result.customBoldFont = myCustomFooterBoldFont; 

     return result;  } 

после этого, просто добавить к документу. Надеюсь это поможет.

+0

То, что я сделал, состоит в том, что если я хочу применить общий водяной знак, я бы хотел применить CustomFooter и CustomWatermark к тому же документу, оба класа идеально подходят для других документов. – Marc

+0

Почему вы не можете создать метод для каждого ... позволяет назвать его частью документа? – Th0rndike

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