Non riesco a creare una intestazione con itext che contenga immagini e che si ripeta per ogni pagina.
stesso discorso per il piè di pagina.
chimmi posta un esempio, perchè quelli che ho trovato non risolvono il mio problema.
Non riesco a creare una intestazione con itext che contenga immagini e che si ripeta per ogni pagina.
stesso discorso per il piè di pagina.
chimmi posta un esempio, perchè quelli che ho trovato non risolvono il mio problema.
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
non trovo il corrispondente java dicodice:pdfClass.MyHandler myEvents = new pdfClass.MyHandler();
ovviamente non voleva essere un copia-incolla: c'è da leggersi un po' di documentazione e comprendere la gestione degli eventi in iText (ce n'è diversi, ma qui utilizziamo solo onPageStart e onPageEnd).
Questo dovrebbe essere un esempio funzionante
Crea un documento in formato A4, con margini tutti uguali. Font standard (un po' grandino). Le immagini non sono ottimizzate, però se vuoi te le allego lo stesso (sono alte 100).codice:import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import java.io.*; /** * * @author Andrea */ public class HeaderFooter { private Image header, footer; private String path = "C:/Users/Andrea/Desktop/headerfooter.pdf"; class PageEventsHandler extends PdfPageEventHelper { public void onStartPage (PdfWriter writer, Document document) { try { document.add(header); } catch (Exception e) { e.printStackTrace(); } } public void onEndPage (PdfWriter writer, Document document) { try { document.add(footer); } catch (Exception e) { e.printStackTrace(); } } } public HeaderFooter() { try { this.header = Image.getInstance("header.jpg"); this.footer = Image.getInstance("footer.jpg"); float footerHeight = footer.getHeight(); footer.setAbsolutePosition(20, 20); Document document = new Document(PageSize.A4, 20, 20, 20, 20+footerHeight); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(path)); PageEventsHandler events = new PageEventsHandler(); writer.setPageEvent(events); document.open(); for (int i = 0; i < 100; i++) { document.add(new Paragraph("Riga: "+i+"... Testiamo sta cosa")); } document.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main (String[] args) { new HeaderFooter(); } }
Quel che faccio è: definisco i margini a 20 (alto, sinistro e destro). Per il margine inferiore prendo 20 + l'altezza dell'immagine. Il footer è posizionato in modo assoluto, a 20:20. Il resto lo fa in automatico.
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"
lavorandoci da solo (mi sono appena collegato) ero arrivato a questo:
da collegare al documento in questo modo:codice:/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package gestioneStampe; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import java.io.IOException; import java.net.MalformedURLException; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Utente1 */ public class IntestazionePdf extends PdfPageEventHelper { private final Font GRASSETTO10 = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD); private final Font NORMALE8 = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.NORMAL); private final Font NORMALE6 = new Font(Font.FontFamily.TIMES_ROMAN, 6, Font.NORMAL); @Override public void onStartPage(PdfWriter writer, Document document) { try { PdfContentByte directContent = writer.getDirectContent(); directContent.saveState(); directContent.setLineWidth(1.0f); directContent.moveTo(56.7f, 742.78f); directContent.lineTo(538.65f, 742.78f); directContent.moveTo(56.7f, 99.22f); directContent.lineTo(538.65f, 99.22f); directContent.stroke(); directContent.restoreState(); Rectangle rect = writer.getBoxSize("art"); Image logoFederimprese = Image.getInstance(getClass().getResource("/images/logo.png")); logoFederimprese.scaleAbsolute(311.81f, 70.86f); logoFederimprese.setAbsolutePosition(56.70f, 750f); document.add(logoFederimprese); Image logoClaai = Image.getInstance(getClass().getResource("/images/logoclaai.png")); logoClaai.scaleAbsolute(141.73f, 70.86f); logoClaai.setAbsolutePosition(396.85f, 750f); document.add(logoClaai); Phrase primo = new Phrase(0, "asdasdsa", GRASSETTO10); Phrase secondo = new Phrase(0, "asdae", NORMALE8); Phrase terzo = new Phrase(0, "adsasd", NORMALE8); Phrase quarto = new Phrase(0, "asdsada", NORMALE8); Phrase quinto = new Phrase(0, "asdada", NORMALE6); ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, primo, rect.getLeft(), rect.getBottom() - 15, 0); ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, secondo, rect.getLeft(), rect.getBottom() - 25, 0); ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, terzo, rect.getLeft(), rect.getBottom() - 35, 0); ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, quarto, rect.getLeft(), rect.getBottom() - 45, 0); ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, quinto, rect.getLeft(), rect.getBottom() - 55, 0); } catch (DocumentException ex) { Logger.getLogger(IntestazionePdf.class.getName()).log(Level.SEVERE, null, ex); } catch (MalformedURLException ex) { Logger.getLogger(IntestazionePdf.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(IntestazionePdf.class.getName()).log(Level.SEVERE, null, ex); } } }
però io ho utilizzato solo onStartPage, credi che sia un problema??? ovviamente funziona, quindi come si dice...il fine giustifica i mezzi, ma è per capire meglio!!!codice:Rectangle dimensioniPagina = new Rectangle(PageSize.A4); Document documento = new Document(dimensioniPagina, 56.7f, 56.7f, 99.22f, 99.22f); PdfWriter pdfWriter = PdfWriter.getInstance(documento, new FileOutputStream(path)); pdfWriter.setBoxSize("art", new Rectangle(56.7f, 99.21f, 481.89f, 779.52f)); IntestazionePdf intestazionePdf = new IntestazionePdf(); pdfWriter.setPageEvent(intestazionePdf);
P.S.: inserisco 2 immagini sopra con linea e 5 righe sotto con linea, e funziona.
Non so se sia un problema, nel mio esempio ho preferito usare entrambi gli eventi. Comunque se hai fatto un po' di prove (magari cambiando la lunghezza dei contenuti) e la cosa funziona ed appare solida, ti direi di lasciare così com'è adesso: non è buona pratica, lo so, ma come dicono gli americani "if it ain't broke, don't fix it"
<´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
"The answer to your question is: welcome to tomorrow"