问题描述
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));