SetNextRenderer 不会触发 IText7 中渲染器的绘制方法

SetNextRenderer Doesn't Trigger Draw Method For Renderer In IText7

我有一个自定义 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 方法总是 returns 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));