【问题标题】:START_PAGE only makes the header for the first pageSTART_PAGE 只制作第一页的标题
【发布时间】:2020-02-07 05:55:07
【问题描述】:

我有这个用于 Web 开发的代码:

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);

以及其他向页面添加更多内容的代码。 它只为第一页制作页眉。

【问题讨论】:

    标签: asp.net .net itext7


    【解决方案1】:

    您正在混合来自不同 iText 版本的事件处理。

    在 iText 5 中,您曾经实现 IPdfPageEvent,通常是通过扩展 PdfPageEventHelper,而这里您有单独的方法,例如

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

    等等

    在 iText 7 中,您实现 IEventHandler,它只有一个方法,

    void HandleEvent(Event @event)
    

    您要么仅为一种事件类型注册事件处理程序,因此在HandleEvent 中知道正确的事件已到达,或者您根据事件类型 (@event.GetEventType()) 确定您获得并执行的事件类型相应的代码。

    改变页面旋转的事件监听器示例

    例如在this example 中,事件处理程序仅注册为页面启动

    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() {
            }
        }
    }
    

    添加页眉和页脚的示例页面监听器

    在 cmets 中,您要求 标题示例而不是旋转页面。对于那个样子,例如在 iText 7 Jump-Start Tutorial 第 3 章 (Using renderers and event handlers) 示例 C03E03_UFO (Java version / C# version) 中使用事件侦听器添加背景、水印、页眉和页脚:

    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。不过,这种差异应该不会造成太大影响。

    【讨论】:

    • 在无状态编程(即 asp.net )中不存在类似 C07E01_EventHandlers 的东西。请你写标题的例子而不是旋转页面。 AVI
    • public virtual void HandleEvent(Event @event) { PdfDocumentEvent docEvent = (PdfDocumentEvent)@event; docEvent.GetPage().Put(PdfName.Rotate, this.rotation); }
    • 如果我想添加段落,这不起作用。请帮忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多