SetNextRenderer不会触发IText7中Renderer的绘制方法

问题描述

我有一个自定义的AreaBreak渲染器,如下所示:

 protected internal class CustomAreaBreakRenderer: AreaBreakRenderer
 {
      public Document document { get; set; }      
      public CustomAreaBreakRenderer(AreaBreak areaBreak,Document document) : base(areaBreak)
      {
          this.document = document;  
      }

      public override IRenderer GetNextRenderer()
      {
          document.Add(TableFactory.CreatelogoBlock());
          return new CustomAreaBreakRenderer(areaBreak,document);
      }
    
      public override void Draw(DrawContext drawContext)
      {
          base.Draw(drawContext); 
          document.Add(TableFactory.CreateContentBlock());
      }
 }

并且我将此渲染器设置为:

var areaBreak = new AreaBreak();
var renderer  = new CustomAreaBreakRenderer(areaBreak,document);
areaBreak.SetNextRenderer(renderer);
document.Add(areaBreak);

调试代码时,

GetNextRenderer()方法正在触发,但Draw()未触发。

我使用了另一种渲染器,例如CustomTableRenderers或CustomParagraphRenderers,我一直使用相同的方法,但是对于这一方法,我无法按预期使用渲染器。

请帮助..:)

注意:我尝试使用TableRenderer并成功,这似乎仅在AreaBreakRenderer中发生!

解决方法

不应绘制AreaBreakRenderer,其layout方法始终返回NOTHING

如果您想赶上下一页的事件并在发生这种情况时绘制一些东西,则应该改用DocumentRenderer。这是一个示例:

private static class CustomDocumentRenderer extends DocumentRenderer {
    public CustomDocumentRenderer(Document document) {
        super(document);
    }

    @Override
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
        LayoutArea prevArea = currentArea != null ? currentArea.clone() : null;
        LayoutArea newArea = super.updateCurrentArea(overflowResult);
        if (prevArea == null || prevArea.getPageNumber() != newArea.getPageNumber()) {
            document.add(new Paragraph("Hello"));
        }
        return newArea;
    }
}

将自定义渲染器插入其中很容易:

Document doc = new Document(pdfDoc);

doc.setRenderer(new CustomDocumentRenderer(doc));