मेरे पास नीचे दिखाया गया एक कस्टम एरियाब्रेक रेंडरर है:

 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() ट्रिगर नहीं हो रही है।

मैंने कस्टमटेबलरेंडरर्स या कस्टमपैराग्राफरेंडरर्स जैसे अन्य रेंडरर्स का उपयोग किया है और मैंने हमेशा एक ही दृष्टिकोण का उपयोग किया है लेकिन इसके लिए, मैं उम्मीद के मुताबिक रेंडरर का उपयोग नहीं कर सकता ..

कृपया सहायता कीजिए.. :)

नोट: मैंने TableRenderer की कोशिश की और यह काम कर गया, ऐसा लगता है कि यह केवल AreaBreakRenderer में हो रहा है!

0
Burak 8 सितंबर 2020, 14:10

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));
1
Alexey Subach 9 सितंबर 2020, 21:16