【问题标题】:SetNextRenderer Doesn't Trigger Draw Method For Renderer In IText7SetNextRenderer 不会触发 IText7 中渲染器的绘制方法
【发布时间】:2020-09-08 11:10:09
【问题描述】:

我有一个自定义的 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 中!

【问题讨论】:

    标签: c# itext itext7


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,正如我上面提到的,我可以使用其他渲染器做到这一点,但我试图理解为什么我不能绘制 AreaBreakRenderer。我不知道它的布局方法是什么都不返回。谢谢。
    • 顺便说一句,从文档中更新draw方法不是更正确吗?它可以说你不能绘制一个 AreaBreakRenderer...解释与另一个 Renderer Api 的绘制方法相同,所以这让我对这种情况感到困惑..api.itextpdf.com/iText7/java/7.1.3/com/itextpdf/layout/renderer/…
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2017-03-12
    • 2017-06-09
    • 2021-12-15
    相关资源
    最近更新 更多