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