Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Java iText - testo sotto immagini

    ciao!
    sto usando iText per creare dei pdf.
    devo aggiungere delle immagini, e sotto immagine un testo.
    ho provato così:
    codice:
        private PdfPTable tabellaRighe() throws BadElementException, MalformedURLException, IOException, DocumentException {
            int[] cellWidth = {500, 95};
            PdfPTable table = new PdfPTable(2);
            table.setWidths(cellWidth);
            table.setTotalWidth(PageSize.A4.getWidth() - 45);
            table.setLockedWidth(true);
            PdfPCell cell;
            cell = new PdfPCell();
            cell.setBorderWidth(0);
            Paragraph p = new Paragraph();
            for (int i = 0; i < 4; i++) {
                Image image = Image.getInstance(imgNd);
                image.scaleToFit(300, 135);
                Phrase ph = new Phrase();
                ph.add(new Chunk(image, 0, 0, true));
                ph.add("CIAO");
                p.add(ph);
            }
            cell.addElement(p);
            table.addCell(cell);
            cell = new PdfPCell();
            cell.setBorderWidthBottom(1);
            cell.setBorderWidthLeft(1);
            cell.setBorderWidthRight(1);
            cell.setBorderWidthTop(1);
            table.addCell(cell);
            return table;
        }
    e non ha funzionato benissimo.
    il testo non è proprio sotto all'immagine.
    come posso fare??

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Per pigrizia, ho preso uno degli esempi di iText che usano tabelle e l'ho modificato (semplificato) un po'
    codice:
    import java.io.*;
    
    import com.itextpdf.text.*;
    import com.itextpdf.text.pdf.*;
    /**
     *
     * @author Andrea
     */
    public class ImageCaption {
        
        public static final String RESULT = "C:/Users/Andrea/Desktop/imagecaptions.pdf";
        public static final String image = "C:/Users/Andrea/Desktop/198995_1020_A.jpg";
        
        public PdfPTable imageCaption() throws Exception {
            PdfPTable pdfTable = new PdfPTable(1);
            pdfTable.setWidthPercentage(40f);
                          
            Image img = Image.getInstance(image);
            img.scalePercent(40f);
            
            PdfPCell cell;
            
            //immagine
            cell = new PdfPCell(img);
            cell.disableBorderSide(Rectangle.BOX);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            pdfTable.addCell(cell);
            
            // testo
            Phrase p = new Phrase("Didascalia Immagine");        
            cell = new PdfPCell(p);
            cell.disableBorderSide(Rectangle.BOX);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);        
            
            pdfTable.addCell(cell);        
            
            return pdfTable;
        }
        
        public void createPdf(String filename)  throws Exception {    	
            
            Document document = new Document();        
            PdfWriter.getInstance(document, new FileOutputStream(filename));
            document.open();
            
            PdfPTable table = imageCaption();
            document.add(table);
            document.close();
        }
        
        public static void main (String[] args)  {
            try {
                new ImageCaption().createPdf(RESULT);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }    
    }
    questo mette immagine e testo impiliati, al centro.
    Ho provato il tuo codice, ma non vedo dove setti l'allineamento n'è un eventuale acapo tra immagine e testo... non che è quello il problema?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Riprendendo un po' il tuo codice, ho aggiunto una tabella secondaria in cui impilo immagini e didascalie.
    codice:
    private PdfPTable tabellaRighe() throws Exception {
            
            // Tabella Principale.
            int[] cellWidth = {500, 95};
            PdfPTable table = new PdfPTable(2);
            table.setWidths(cellWidth);
            table.setTotalWidth(PageSize.A4.getWidth() - 45);
            table.setLockedWidth(true);
            
            // Tabella secondaria
            PdfPTable imageTable = new PdfPTable(4);
            PdfPCell cell;        
            //immagini
            for (int i = 0; i < 4; i++) {
                //Image image = Image.getInstance(imgNd);
                Image img = Image.getInstance(image);
                img.scaleToFit(300, 135);
                cell = new PdfPCell(img);
                cell.disableBorderSide(Rectangle.BOX);
                cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                imageTable.addCell(cell);            
            }
            // didascalie
            
            Font font = new Font(FontFamily.HELVETICA, 8, Font.BOLDITALIC, new BaseColor(0, 0, 0));
            for (int i = 0; i < 4; i++) {
                Phrase p = new Phrase("Didascalia Immagine "+(i+1), font);                
                cell = new PdfPCell(p);
                cell.disableBorderSide(Rectangle.BOX);
                cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                imageTable.addCell(cell);            
            }
            cell = new PdfPCell(imageTable);
            cell.disableBorderSide(Rectangle.BOX);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(cell);
            
            cell = new PdfPCell();
            cell.setBorderWidthBottom(1);
            cell.setBorderWidthLeft(1);
            cell.setBorderWidthRight(1);
            cell.setBorderWidthTop(1);
            table.addCell(cell);
            return table;
        }
    e questo lavora degnamente. Si poteva fare tutto con una tabella, ed eventualmente rowSpan per l'ultima cella
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    ciao!!
    grazie per la risposta!!

    mi sono visto il tuo codice.
    stavo anche io tentando con una tabella dentro l'altra.
    fino a che mi hanno detto che in verità non sono sempre 4 immagini, ma posono essere di più o di meno perchè vengono prese da db.
    inoltre ogni 4 devono andare a capo.

    avevo anche pensato di non mettere tutto in una cella, ma di creare varie celle.
    in modo da non usare più tabelle innestate.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    vabbhè, il fatto che siano più di un tot: su quello quando estrai dal database, conti i record e ti regoli: d'altronde il costruttore di PdfPTable richiede solo di sapere quante colonne ci saranno e tu sai già che ne avrai 4.

    Certo, non sono affatto un esperto di iText per cui non ti so dire se ci siano modi più rapidi, efficienti o formalmente corretti per centrare testi e immagini impilati...
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    la problematica è questa:
    codice:
            PdfPTable imageTable = new PdfPTable(col);
            imageTable.setTotalWidth(495);
            imageTable.setLockedWidth(true);
           ................
    il numero di colonne e di immagini glielo passo come paramentro.
    il problema è che finchè sono 4 ok, sennò si slarga tutto anche se ho bloccato la larghezza.
    e la stessa cosa succede se uso le celle senza un'altra tabella secondaria.
    in pratica le celle non vanno a capo.
    per quello mettevo tutto dentro ad un'unica cella

    dovrei, forse, ogni 4 creare un'altra tabella "secondaria".

    oppure trovare un altro modo.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    eh, su questo non ti saprei aiutare... ho provato ad aggiungere 10 immagini senza scalare ed ottengo un errore:
    codice:
    com.itextpdf.text.DocumentException: com.itextpdf.text.DocumentException: Infinite table loop; row content is larger than the page (for instance because you didn't scale an image).
    	at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:727)
    	at com.itextpdf.text.Document.add(Document.java:282)
    	at test.tables.ImageCaption.createPdf(ImageCaption.java:103)
    	at test.tables.ImageCaption.main(ImageCaption.java:109)
    Caused by: com.itextpdf.text.DocumentException: Infinite table loop; row content is larger than the page (for instance because you didn't scale an image).
    	at com.itextpdf.text.pdf.PdfDocument.addPTable(PdfDocument.java:2372)
    	at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:673)
    quindi non so perché ti si allarghi il tutto. Scalando invece al limite si sovrappongono un po' le immagini e le didascalie mi vanno acapo da sole...

    Comunque, visto che un po' mi ci sto "appassionando" a sta iText, ho rimesso nuovamente mano al codice di cui sopra. In sostanza, sapendo quante immagini hai, quante immagini per riga vuoi, si determinano sia il numero di righe complete che l'eventuali immagini "spurie". Poi si tratta di fare un paio di cicli annidati per le righe complete ed un ciclo esterno per le immagini spurie. Tutto per ragioni "cosmetiche"
    codice:
    private PdfPTable tabellaRighe() throws Exception {
            
            // Tabella Principale.
            int[] cellWidth = {500, 95};
            PdfPTable table = new PdfPTable(2);
            table.setWidths(cellWidth);
            table.setTotalWidth(PageSize.A4.getWidth() - 45);
            table.setLockedWidth(true);
            
            // Tabella secondaria
            int quante_immagini = 10;
            int quante_per_riga = 4;
            
            int righe_complete = quante_immagini / quante_per_riga;
            int spurie = quante_immagini % quante_per_riga;
            
            PdfPTable imageTable = new PdfPTable(quante_per_riga);
            PdfPCell cell;                    
            
                    
            Font font = new Font(FontFamily.HELVETICA, 8, Font.BOLDITALIC, new BaseColor(0, 0, 0));
            int didascalia = 0; // indice didascalia
            // righe complete
            for (int j = 0; j < righe_complete; j++) {
                
                // ciclo for per le immagini
                for (int i = 0; i < quante_per_riga; i++) {                
                    //Image image = Image.getInstance(imgNd);
                    Image img = Image.getInstance(image);
                    img.scaleToFit(300, 135);
                    cell = new PdfPCell(img);
                    cell.disableBorderSide(Rectangle.BOX);
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                    imageTable.addCell(cell);                
                }
                
                // ciclo for per didascalia
                
                for (int i = 0; i < quante_per_riga ; i++) {                
                    Phrase p = new Phrase("Didascalia Immagine "+(didascalia+1), font);                
                    cell = new PdfPCell(p);
                    cell.disableBorderSide(Rectangle.BOX);
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                    imageTable.addCell(cell);            
                    didascalia++;
                }
                
            }
            
            if (spurie != 0) {
            // riga incompleta
            // ciclo for per le immagini
                for (int i = 0; i < quante_per_riga; i++) {                
                    //Image image = Image.getInstance(imgNd);
                    Image img;
                    if (i < spurie) {
                        img = Image.getInstance(image);
                        img.scaleToFit(300, 135);
                    }
                    else {
                        img = null;
                    }
                    cell = new PdfPCell(img);
                    cell.disableBorderSide(Rectangle.BOX);
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                    imageTable.addCell(cell);                
                }
                
                // ciclo for per didascalia
                
                for (int i = 0; i < quante_per_riga ; i++) {
                    String text;
                    if (i < spurie) {
                        text = "Didascalia Immagine "+(didascalia+1);
                    }
                    else {
                        text = "";
                    }
                    Phrase p = new Phrase(text, font);                
                    cell = new PdfPCell(p);
                    cell.disableBorderSide(Rectangle.BOX);
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                    imageTable.addCell(cell);            
                    didascalia++;
                }
            }
            
            cell = new PdfPCell(imageTable);
            cell.disableBorderSide(Rectangle.BOX);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(cell);
            
            cell = new PdfPCell();
            cell.setBorderWidthBottom(1);
            cell.setBorderWidthLeft(1);
            cell.setBorderWidthRight(1);
            cell.setBorderWidthTop(1);
            table.addCell(cell);
            return table;
        }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    quello che stai tentando è un'ottima idea devo dire!!
    mi metto subito a lavoro per integrarlo con tutto il resto.
    ho però fatto una modifca a questo pezzo:
    codice:
                    Image img;
                    if (i < spurie) {
                        img = Image.getInstance(imgNd);
                        img.scaleToFit(300, 135);
                    } else {
                        img = null;
                    }
                    cell = new PdfPCell(img); // ERRORE
    l'ho messo così:
    codice:
                    Image img;
                    if (i < spurie) {
                        img = Image.getInstance(imgNd);
                        img.scaleToFit(300, 135);
                        cell = new PdfPCell(img);
                    } else {
                        img = null;
                        cell = new PdfPCell();
                    }
    sennò mi dava errore NullPointerException.
    ti faccio sapere!!!
    intanto grazie mille!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    buon divertimento
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.