Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100

    [iText] numero pagina progressivo su pdf

    Giorno a tutti,
    è da un po' che uso iText per la gestione dei report su pdf e mi trovo strabene (per chi non conoscesse queste librerie: http://itextpdf.com/) e ora mi sono arenato su un particolare.
    Ogni volta genero un documento di lunghezza variabile...può essere di 2 pagine, come di 100... e vorrei che in ogni pagina in basso ci fosse la corrispettiva

    PAGINA 1 DI X .....PAGINA N DI X

    Le rare soluzioni che ho trovato in rete sono confuse....qualcuno di voi ha le idee più chiare su come fare?
    Vorrei che il documento fosse salvato già con la numerazione delle pagine...e non come fanno molti (viste le soluzioni proposte) che vanno a ripescarsi il file e applicano queste cose dopo.

    Grazie in anticipo a chi potrà aiutarmi

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Ho dovuto affrontare anch'io questa problematica e l'unica cosa da fare è sapere in anticipo il numero di pagine totali (non ci sono alternative: lo devi sapere prima). Quindi, se tu non hai questa informazione in partenza te la devi ricavare. Come? Dipende da come fai il "salto pagina".

    Se hai, per esempio, un numero di righe "fisso" per pagina, basta che fai due conti.
    Se non ce l'hai (o è variabile), una strada che ho affrontato io è quella di eseguire due volte l'intero codice di costruzione del PDF. La prima per contare il numero di pagine totali, la seconda per creare fisicamente il file. Alla peggio potresti arrivare a dover creare fisicamente il file due volte. La prima per contare il numero di pagine, poi eliminare il file e ricostruirlo correttamente la seconda.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    Mmmm no purtroppo non so in anticipo questa informazione
    Su una guida ho trovato il suggerimento di usare questi 3 metodi:
    codice:
    /* chapter14/PageXofY.java */
    protected PdfTemplate total;
    protected BaseFont helv;
    
    public void onOpenDocument(PdfWriter writer, Document document) {
      total = writer.getDirectContent().createTemplate(100, 100);
      total.setBoundingBox(new Rectangle(-20, -20, 100, 100));
      try {
        helv = BaseFont.createFont(BaseFont.HELVETICA,
        BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
        } catch (Exception e) {
          throw new ExceptionConverter(e);
        }
    }
    
    
    public void onEndPage(PdfWriter writer, Document document) {
      PdfContentByte cb = writer.getDirectContent();
      cb.saveState();
      String text = "Page " + writer.getPageNumber() + " of ";
      float textBase = document.bottom() - 20;
      float textSize = helv.getWidthPoint(text, 12);
      cb.beginText();
      cb.setFontAndSize(helv, 12);
      if ((writer.getPageNumber() % 2) == 1) {
        cb.setTextMatrix(document.left(), textBase);
        cb.showText(text);
        cb.endText();
        cb.addTemplate(total, document.left() + textSize, textBase);
      }
      else {
        float adjust = helv.getWidthPoint("0", 12);
        cb.setTextMatrix(
        document.right() - textSize - adjust, textBase);
        cb.showText(text);
        cb.endText();
        cb.addTemplate(total, document.right() - adjust, textBase);
      }
      cb.restoreState();
    }
    
    
    public void onCloseDocument(PdfWriter writer, Document document) {
      total.beginText();
      total.setFontAndSize(helv, 12);
      total.setTextMatrix(0, 0);
      total.showText(String.valueOf(writer.getPageNumber() - 1));
      total.endText();
    }
    ...solo che non ho capito quando usare il metodo "onEndPage" se io non so quando finisce una pagina piuttosto che un'altra......

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Uhm... interessante.
    Non ho mai usato un PdfTemplate e credo proprio che proverò questa soluzione.

    ...solo che non ho capito quando usare il metodo "onEndPage" se io non so quando finisce una pagina piuttosto che un'altra......
    Beh, per aggiungere una nuova pagina al PDF, da qualche parte dovrai richiamare il metodo newPage() sull'oggetto Document... ecco, quel metodo "onEndPage" va richiamato appena prima.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    Ciao
    anche io ho perso non poco tempo per la numerazione delle pagine poi ho trovato una soluzione e per ora sta funzionando alla perfezione. in pratica mi creo una inner class che estende PdfPageEventHelper:
    codice:
    //inner class per la numerazione delle pagine
        class TableHeader extends PdfPageEventHelper {
            /** The header text. */
            String footer;
            /** The template with the total number of pages. */
            PdfTemplate total;
            
            /**
             * Allows us to change the content of the header.
             * @param header The new header String
             */
            public void setFooter(String footer) {
                this.footer = footer;
            }
    
            /**
             * Creates the PdfTemplate that will hold the total number of pages.
             * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
             *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
             */
            @Override
            public void onOpenDocument(PdfWriter writer, Document document) {
                total = writer.getDirectContent().createTemplate(30, 16);
            }
            
            @Override
            public void onEndPage(PdfWriter writer, Document document) {
                try {                
                    String dataOdierna = (new SimpleDateFormat("dd.MM.yyyy")).format(new Date());
                    // Footer
                    Rectangle page = document.getPageSize();                                               
                    Image img = Image.getInstance(total);
                    PdfPTable footTable = new PdfPTable(3);
                    footTable.setWidths(new int[]{24, 24, 2});
                    footTable.getDefaultCell().setBorder(Rectangle.TOP);
                    PdfPCell cell;
                    cell= uit.getCell(new Phrase(""),3,0,"","");
                    cell = uit.getCellBorderBottom(cell, BaseColor.BLACK, 2f);
                    cell.setFixedHeight(20);
                    cell.setVerticalAlignment(18);
                    footTable.addCell(cell);           
                    PdfPCell cell1 = new PdfPCell(new Phrase("intestazione- " +
                            "esportazione del: " + dataOdierna, small));
                    cell1.setBorder(Rectangle.NO_BORDER);
                    PdfPCell cell2 = new PdfPCell(img);
                    cell2.setBorder(Rectangle.NO_BORDER);
                    
                    footTable.addCell(cell1);
                    String s = String.format("Page %d of", writer.getPageNumber()+1);
                    PdfPCell cell3 = new PdfPCell(new Phrase(s,small));
                    cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    cell3.setBorder(Rectangle.NO_BORDER);
                    cell3.setPaddingTop(Element.ALIGN_TOP-1);
                    footTable.addCell(cell3);
                    footTable.addCell(cell2);
                    footTable.setTotalWidth(page.getWidth() - document.leftMargin()
                            - document.rightMargin());
                    footTable.writeSelectedRows(0, -1, document.leftMargin(), 
                            document.bottomMargin(), writer.getDirectContent());
                }
                catch(DocumentException de) {
                    throw new ExceptionConverter(de);
                }
            }
            @Override
            public void onCloseDocument(PdfWriter writer, Document document) {
                ColumnText.showTextAligned(total, Element.ALIGN_LEFT,
                        new Phrase(String.valueOf(writer.getPageNumber()),small),
                        Element.ALIGN_LEFT, Element.ALIGN_MIDDLE, 0);
            }
        }
    
    //di seguito il metodo che crea il pdf (si trova nella stessa classe)
    Document document = null;
    PdfWriter writer = null; 
    try{
       .....
       document = new Document();
       writer = PdfWriter.getInstance(document, new FileOutputStream(path2 + "/file.pdf"));
       TableHeader event = new TableHeader();
        writer.setPageEvent(event);
        document.open();
        ..............
    Funziona con l'ultima versione della libreria
    tomcat 6.016
    netbeans 6.1

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    Ho provato a utilizzare quest'ultima soluzione ma......non riesco ad avere comunque il totale delle pagine...

    La differenza sta nel fatto che io non ho un path del file da passare al writer perchè.....il file ancora non ce l'ho.... lo creo in un'applicazione web durante l'inserimento di alcuni dati e l'utente deve poter decidere dove salvarlo tramite la classica finestra di download.

    Attualmente uso questa struttura infatti:
    codice:
    ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
    writer = PdfWriter.getInstance(document, baosPDF);
    però appunto, riesco ad avere solo "PAGINA 1 DI ", "PAGINA 2 DI ", ecc... questo utilizzando solo i metodi onOpenDocument e onEndPage.
    Se prima della chiusura del documento uso onCloseDocument ottengo "PAGINA 1 DI 123ecc.. ", "PAGINA 2 DI 123ecc...", ecc... dove per -123ecc...- intendo la numerazione delle pagine totali una sopra l'altra (una schifezza insomma )

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    ciao

    nemmeno io conosco il path e il tutto viene da un'applicazione web.
    il path2 che hai visto viene da qui:
    codice:
    //percorso server 
    ServletContext context = ServletActionContext.getServletContext();
    String path2 = context.getRealPath("download");
    infine per preparare l'output faccio:
    setEsportaPDF("../../download/file.pdf");
    Quest'ultima è una soluzione trovata per le action di struts. L'action non conosce dove finire e quindi la preparo qui e nel file struts.xml basta inserire:
    <result name="success">${esportaPDF}</result>
    naturalmente nell'applicazione mi sono creato la cartella download.
    il nome al file lo decido in base alle scelte dell'utente
    prova a postare il codice

    ps: spero ti riferivi a me
    tomcat 6.016
    netbeans 6.1

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    si si mi riferivo a te ^^ grazie dardo! ora mi inizia a essere più chiaro.... prima di fare delle ulteriori prove, ti chiedo un'ultima cosa....
    ma cosa sarebbe "uit"? (es: cell= uit.getCell(new Phrase(""),3,0,"",""); )
    qualcosa che ha a che fare con l'ultima versione delle librerie? perchè non lo vedo istanziato da nessuna parte (magari sono io accecato )

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    309
    vero ho meso un pò anche parti non complete.
    in pratica ogni volta che si crea una cella (quindi fare una tabella) puoi settare font, orientamento verticale, orizzontale e varie.
    mi sono fatto una classe di utility con un metodo che passate n info mi restituisce una cella gia formattata per il testo e un metodo per i bordi (bottom, top, left, right).
    solo per risparmiare di riscrivere tante volte lo stesso codice. nel caso scritto da te inserisco nella cella una stringa vuota, il 3 indica su quante colonne deve estendersi (colspan).
    tomcat 6.016
    netbeans 6.1

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    100
    Ok tutto chiaro ora......tuttavia continua a darmi lo stesso problema

    Giusto per essere sicuro di invocarli nel modo corretto.... io chiamo i primi 2 metodi dopo l'open:
    codice:
    document.open();
    event.onOpenDocument(writer, document);
    event.onEndPage(writer, document);
    e l'ultimo prima della chiusura del documento:
    codice:
    event.onCloseDocument(writer, document);
    document.close();
    ...anche te fai così?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.