J'essaie de créer un en-tête de page dynamique avec itext7 en utilisant EventHandlers. J'utilise le code ci-dessous pour cela:Problème d'en-tête de page dynamique iText 7
public static void main(String[] args) throws Exception {
File file = new File("C:\\Test\\variable_header.pdf");
file.getParentFile().mkdirs();
new VariableHeader().manipulatePdf(DEST);
}
protected void manipulatePdf(String dest) throws Exception {
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
Document doc = new Document(pdfDoc);
VariableHeaderEventHandler handler = new VariableHeaderEventHandler();
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, handler);
handler.setHeader("First Header");
for (int i = 1; i <= 50; i++) {
doc.add(new Paragraph("Added First content"));
}
doc.add(new AreaBreak());
handler.setHeader("Second Header");
for (int i = 1; i <= 15; i++) {
doc.add(new Paragraph("Added Second content"));
}
doc.close();
}
protected class VariableHeaderEventHandler implements IEventHandler {
protected String header;
public void setHeader(String header) {
this.header = header;
}
@Override
public void handleEvent(Event event) {
PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
try {
new PdfCanvas(documentEvent.getPage())
.beginText()
.setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA), 12)
.moveText(450, 806)
.showText(header)
.endText()
.stroke();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ici, je crée « VariableHeaderEventHandler » qui rend l'en-tête de page dynamique pour chaque page du document.
Initialement, j'ai défini l'en-tête de la page comme "Premier en-tête" et ajouté 50 fois le texte "Premier contenu ajouté" au document. Puis j'ai ajouté le saut de secteur qui laisse l'autre partie de la page vide après avoir rendu le contenu précédent et tout autre contenu sera rendu dans une nouvelle page. Ensuite, j'ai changé l'en-tête de la page en tant que "Deuxième en-tête" et ajouté le texte "Deuxième contenu ajouté" au document pour 15 fois.
Ainsi, selon le code ci-dessus, l'en-tête de la page "Deuxième en-tête" doit être rendu UNIQUEMENT à partir de la page où le texte "Deuxième contenu ajouté" est affiché. Mais la « deuxième tête » est rendu dans la page précédente où le texte « Ajout de contenu d'abord » est affiché comme indiqué ci-dessous:
iText7 question d'en-tête dynamique:
Il semble qu'il y ait un certain problème avec le mécanisme de gestion des événements dans iText 7.0.1.
Existe-t-il un moyen de résoudre ce problème? Toute aide serait appréciée.
Cela semble plus compliqué que l'implémentation de itext 5 de la même tâche. En particulier si vous voulez le chapitre et la section en cours dans l'en-tête ou le pied de page ou quelque chose de similaire dynamique ... – mkl