iTextSharp 中的多个布局事件

Multiple layout events in iTextSharp

是否可以将多个布局事件附加到 PdfPCell?

我看到有一种设置单元格事件的方法:http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfPCell.html#setCellEvent(com.itextpdf.text.pdf.PdfPCellEvent)

我不确定是否可以设置 多个 事件。我想根据我的业务逻辑在单独的事件中分隔不同的单元格选项。有时我想在其中画一个椭圆,有时想画一个正方形(或其他任何东西)。如果我能简单地附加我需要的事件就好了。

感谢您的回复!

是的,您可以向一个单元格添加多个单元格事件。这是 setCellEvent() 方法的 Java 代码:

public void setCellEvent(PdfPCellEvent cellEvent) {
    if (cellEvent == null) {
        this.cellEvent = null;
    } else if (this.cellEvent == null) {
        this.cellEvent = cellEvent;
    } else if (this.cellEvent instanceof PdfPCellEventForwarder) {
        ((PdfPCellEventForwarder) this.cellEvent).addCellEvent(cellEvent);
    } else {
        PdfPCellEventForwarder forward = new PdfPCellEventForwarder();
        forward.addCellEvent(this.cellEvent);
        forward.addCellEvent(cellEvent);
        this.cellEvent = forward;
    }
}

如果您传递 null,则所有现有事件都会从单元格中删除。如果不存在单元格事件,则添加新的单元格事件。如果已经存在单元格事件,则会创建 PdfPCellEventForwarder。这是一个class,存储不同的单元格事件,最终会一个一个地执行所有这些事件。

更新:

iTextSharp (C#) 与 iText (Java) 保持同步,因此此功能也适用于 iTextSharp。我刚刚检查了 iTextSharp 代码,发现了这个:

virtual public IPdfPCellEvent CellEvent {
    get {
        return this.cellEvent;
    }
    set {
        if (value == null) this.cellEvent = null;
        else if (this.cellEvent == null) this.cellEvent = value;
        else if (this.cellEvent is PdfPCellEventForwarder) ((PdfPCellEventForwarder)this.cellEvent).AddCellEvent(value);
        else {
            PdfPCellEventForwarder forward = new PdfPCellEventForwarder();
            forward.AddCellEvent(this.cellEvent);
            forward.AddCellEvent(value);
            this.cellEvent = forward;
        }
    }
}

因此无需创建您自己的 PdfPCellEventForwarder(尽管您可以根据需要创建),如果您添加多个,iTextSharp 将负责在您的位置创建一个 PdfPCellEventForwarder PdfPCell.

事件