START_PAGE создает заголовок только для первой страницы - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть этот код для веб-разработки:

protected internal class MyEventHandler : iText.Kernel.Events.IEventHandler
{
    public virtual void HandleEvent(iText.Kernel.Events.Event @event)
    {
        iText.Kernel.Events.PdfDocumentEvent docEvent = 
                (iText.Kernel.Events.PdfDocumentEvent)@event;
        PdfDocument pdfDoc = docEvent.GetDocument();
    }

    public void onStartPage(
        iText.Kernel.Pdf.PdfWriter writer, iText.Layout.Document document)
    {
        // paragragrap for start pages
        …
    }
}

MyEventHandler StartPage = new MyEventHandler();
pdf.AddEventHandler(iText.Kernel.Events.PdfDocumentEvent.START_PAGE, new MyEventHandler());
StartPage.onStartPage(writer, document);

И другой код, который добавляет больше на страницу. Заголовок только для первой страницы.

1 Ответ

1 голос
/ 07 февраля 2020

Вы смешиваете обработку событий из разных версий iText.

В iText 5 вы использовали для реализации IPdfPageEvent, часто расширяя PdfPageEventHelper, и здесь у вас были отдельные методы, такие как

void OnStartPage(PdfWriter writer, Document document)
void OnEndPage(PdfWriter writer, Document document)

et c.

В iText 7 вы реализуете IEventHandler, который имеет только один метод,

void HandleEvent(Event @event)

Вы регистрируете свой обработчик событий только для одного типа события и следовательно, в HandleEvent узнайте, что пришло правильное событие, или вы определяете на основе типа события (@event.GetEventType()), какой тип события вы получили, и выполните соответствующий код.

Пример изменения прослушивателя событий поворот страницы

Например, в этом примере обработчик событий зарегистрирован только для запуска страниц

C07E01_EventHandlers.PageRotationEventHandler eventHandler = new PageRotationEventHandler();
pdf.AddEventHandler(PdfDocumentEvent.START_PAGE, eventHandler);

и в своем методе обработки событий действует соответственно

public virtual void HandleEvent(Event @event) {
    PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
    docEvent.GetPage().Put(PdfName.Rotate, this.rotation);
}

Полный пример класса:

public class C07E01_EventHandlers {
    public const String DEST = "../../../results/chapter07/jekyll_hyde_page_orientation.pdf";

    public static readonly PdfNumber PORTRAIT = new PdfNumber(0);

    public static readonly PdfNumber LANDSCAPE = new PdfNumber(90);

    public static readonly PdfNumber INVERTEDPORTRAIT = new PdfNumber(180);

    public static readonly PdfNumber SEASCAPE = new PdfNumber(270);

    public static void Main(String[] args) {
        FileInfo file = new FileInfo(DEST);
        file.Directory.Create();
        new C07E01_EventHandlers().CreatePdf(DEST);
    }

    public virtual void CreatePdf(String dest) {
        PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
        pdf.GetCatalog().SetPageLayout(PdfName.TwoColumnLeft);
        C07E01_EventHandlers.PageRotationEventHandler eventHandler = new PageRotationEventHandler();
        pdf.AddEventHandler(PdfDocumentEvent.START_PAGE, eventHandler);
        Document document = new Document(pdf, PageSize.A8);
        document.Add(new Paragraph("Dr. Jekyll"));
        eventHandler.SetRotation(INVERTEDPORTRAIT);
        document.Add(new AreaBreak());
        document.Add(new Paragraph("Mr. Hyde"));
        eventHandler.SetRotation(LANDSCAPE);
        document.Add(new AreaBreak());
        document.Add(new Paragraph("Dr. Jekyll"));
        eventHandler.SetRotation(SEASCAPE);
        document.Add(new AreaBreak());
        document.Add(new Paragraph("Mr. Hyde"));
        document.Close();
    }

    protected internal class PageRotationEventHandler : IEventHandler {
        protected internal PdfNumber rotation = C07E01_EventHandlers.PORTRAIT;

        public virtual void SetRotation(PdfNumber orientation) {
            this.rotation = orientation;
        }

        public virtual void HandleEvent(Event @event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
            docEvent.GetPage().Put(PdfName.Rotate, this.rotation);
        }

        internal PageRotationEventHandler() {
        }
    }
}

Пример слушателя страницы с добавлением верхних и нижних колонтитулов

В комментариях вы просили указать пример для заголовка, а не для поворота страницы . Для этого посмотрите, например, Учебное пособие по началу работы с iText 7 глава 3 ( Использование средств визуализации и обработчиков событий ), пример C03E03_UFO (Java версия / C# версия ), в которой прослушиватель событий используется для добавления фона, водяного знака, верхнего колонтитула и нижнего колонтитула:

public class C03E03_UFO {

    internal static PdfFont helvetica = null;

    internal static PdfFont helveticaBold = null;

    public static void Main(String[] args) {
        helvetica = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);
        helveticaBold = PdfFontFactory.CreateFont(StandardFonts.HELVETICA_BOLD);
        ...
    }

    protected internal virtual void CreatePdf(String dest) {
        //Initialize PDF document
        PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
        pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, new C03E03_UFO.MyEventHandler(this));
        ...
    }

    ...

    protected internal class MyEventHandler : IEventHandler {
        public virtual void HandleEvent(Event @event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
            PdfDocument pdfDoc = docEvent.GetDocument();
            PdfPage page = docEvent.GetPage();
            int pageNumber = pdfDoc.GetPageNumber(page);
            Rectangle pageSize = page.GetPageSize();
            PdfCanvas pdfCanvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc);
            //Set background
            Color limeColor = new DeviceCmyk(0.208f, 0, 0.584f, 0);
            Color blueColor = new DeviceCmyk(0.445f, 0.0546f, 0, 0.0667f);
            pdfCanvas.SaveState()
                     .SetFillColor(pageNumber % 2 == 1 ? limeColor : blueColor)
                     .Rectangle(pageSize.GetLeft(), pageSize.GetBottom(), pageSize.GetWidth(), pageSize.GetHeight())
                     .Fill()
                     .RestoreState();
            //Add header and footer
            pdfCanvas.BeginText()
                     .SetFontAndSize(C03E03_UFO.helvetica, 9)
                     .MoveText(pageSize.GetWidth() / 2 - 60, pageSize.GetTop() - 20)
                     .ShowText("THE TRUTH IS OUT THERE")
                     .MoveText(60, -pageSize.GetTop() + 30)
                     .ShowText(pageNumber.ToString())
                     .EndText();
            //Add watermark
            iText.Layout.Canvas canvas = new iText.Layout.Canvas(pdfCanvas, pdfDoc, page.GetPageSize());
            canvas.SetFontColor(ColorConstants.WHITE);
            canvas.SetProperty(Property.FONT_SIZE, UnitValue.CreatePointValue(60));
            canvas.SetProperty(Property.FONT, C03E03_UFO.helveticaBold);
            canvas.ShowTextAligned(new Paragraph("CONFIDENTIAL"), 298, 421, pdfDoc.GetPageNumber(page), TextAlignment.
                CENTER, VerticalAlignment.MIDDLE, 45);
            pdfCanvas.Release();
        }

        internal MyEventHandler(C03E03_UFO _enclosing) {
            this._enclosing = _enclosing;
        }

        private readonly C03E03_UFO _enclosing;
    }
}

Строго говоря, этот пример слушает PdfDocumentEvent.END_PAGE вместо PdfDocumentEvent.START_PAGE. Однако эта разница не должна сильно ранить.

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