iText7中的PdfPCellEvent等价物是什么?

时间:2018-07-02 14:25:54

标签: itext7

我正在尝试从白皮书“ digitalsignatures20130304 Bruno Lowagie的白皮书” [第54页]中运行一些示例。我找不到PdfPCellEvent,PdfContentByte的iText7等效项。 请引导我。

1 个答案:

答案 0 :(得分:0)

iText 7不是具有某些重构的程序包或类名称的iText 5的克隆,它具有新的体系结构。因此,不一定总是有1:1对应的类,但是还有其他方法可以达到相同的效果。

有助于iText人员查看样本的端口;在github上,您可以从i7js-signatures项目中移植到iText 7的白皮书中找到许多示例。

例如,您提到了Digital Signatures for PDF documents白皮书的第54页。考虑到您给的关键字以及该页面上只有一个示例的事实,我假设您想翻译此方法和帮助程序类:

protected PdfPCell createSignatureFieldCell(PdfWriter writer, String name) {
    PdfPCell cell = new PdfPCell();
    cell.setMinimumHeight(50);
    PdfFormField field = PdfFormField.createSignature(writer);
    field.setFieldName(name);
    field.setFlags(PdfAnnotation.FLAGS_PRINT);
    cell.setCellEvent(new MySignatureFieldEvent(field));
    return cell;
}

public class MySignatureFieldEvent implements PdfPCellEvent {
    public PdfFormField field;

    public MySignatureFieldEvent(PdfFormField field) {
        this.field = field;
    }

    public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
        PdfWriter writer = canvases[0].getPdfWriter();
        field.setPage();
        field.setWidget(position, PdfAnnotation.HIGHLIGHT_INVERT);
        writer.addAnnotation(field);
    }
}

您在类C2_11_SignatureWorkflow中找到了此端口:

protected Cell createSignatureFieldCell(String name) {
    Cell cell = new Cell();
    cell.setHeight(50);
    cell.setNextRenderer(new SignatureFieldCellRenderer(cell, name));
    return cell;
}

class SignatureFieldCellRenderer extends CellRenderer {
    public String name;

    public SignatureFieldCellRenderer(Cell modelElement, String name) {
        super(modelElement);
        this.name = name;
    }

    @Override
    public void draw(DrawContext drawContext) {
        super.draw(drawContext);
        PdfFormField field = PdfFormField.createSignature(drawContext.getDocument(), getOccupiedAreaBBox());
        field.setFieldName(name);
        field.getWidgets().get(0).setHighlightMode(PdfAnnotation.HIGHLIGHT_INVERT);
        field.getWidgets().get(0).setFlags(PdfAnnotation.PRINT);
        PdfAcroForm.getAcroForm(drawContext.getDocument(), true).addField(field);
    }
}

如您所见,存在某些差异,特别是不是使用Renderer来代替事件,并且字段的构造和位置不再分开,它们在代码中的相同位置进行。