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));
我有一个自定义 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));