Что такое эквивалент PdfPCellEvent в iText7? - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь запустить некоторые образцы из белой книги "digitalsignatures20130304 A White Paper by Bruno Lowagie" [страница 54]. Я не смог найти эквиваленты iText7 для PdfPCellEvent, PdfContentByte. Пожалуйста, ведите меня.

1 Ответ

0 голосов
/ 12 июля 2018

iText 7 - это не клон iText 5 с некоторыми измененными именами пакетов или классов, он имеет новую архитектуру. Таким образом, не всегда существует соответствующий класс 1: 1, но есть другие способы достижения того же эффекта.

Это помогает взглянуть на порты образцов людьми iText; на github вы можете найти множество образцов из документа, портированного на iText 7 в проекте i7js-signatures .

Например, вы упомянули страницу 54 Цифровой подписи для документов PDF . Учитывая приведенные вами ключевые слова и тот факт, что на этой странице есть только один пример, я предполагаю, что вы хотите перевести этот метод и вспомогательный класс:

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, а конструкция поля и позиционирование больше не разделяются, они происходят в том же месте в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...