Saltar al contenido

La imagen cambia de tamaño automáticamente en PdfPCell con iTextSharp

Después de de nuestra larga recopilación de información dimos con la solución este rompecabezas que tienen muchos de nuestros lectores. Te dejamos la respuesta y deseamos resultarte de mucha apoyo.

Solución:

Estoy usando iTextSharp v4.1.2 y obtengo el siguiente comportamiento:

Usando este código, agregando la imagen directamente a la tabla a través del método AddCell, la imagen se amplía para ajustarse a la celda:

nestedTable.AddCell(image);

Usando este código, agregando la imagen a una celda, luego agregando la celda a la tabla, la imagen se muestra en su tamaño original:

PdfPCell cell = new PdfPCell(image);
cell.HorizontalAlignment = PdfPCell.ALIGN_CENTER;
nestedTable.AddCell(cell);

¿Ha agregado la imagen directamente al documento pdf (fuera de la tabla) solo para comparar/comprobar dos veces los tamaños de imagen?

document.add(image);


Supongo que desea que la imagen esté centrada en la celda con algo de espacio a su alrededor. Como último recurso, puede cambiar su imagen. Conviértalo en un png con un fondo transparente, y solo asegúrese de que haya un ‘margen’ transparente alrededor de todos los bordes de su imagen.

EDITAR

Acabo de descargar v5.0.2 y obtengo los mismos resultados que se mencionaron anteriormente. Lo he probado con imágenes que son tanto más pequeñas como más grandes que el tamaño de la celda, y el comportamiento es el mismo; el primer método escala la imagen, el segundo método no.

EDITAR

Bueno, aparentemente me he equivocado durante años sobre todo el asunto de DPI cuando se trata de imágenes. Parece que no puedo ver que haga ninguna diferencia en absoluto cuál es el DPI de la imagen.
Creé una imagen de 600x400px en tres resoluciones diferentes, 72 ppp, 96 ppp y 110 ppp. Luego agregué cada una de estas imágenes a un nuevo documento que tenía exactamente 600×400.

Dim pSize As Rectangle = New Rectangle(600, 1000)
Dim document As Document = New Document(pSize, 0, 0, 0, 0)

Para cada uno de los tres archivos de imagen, cuando se agregan al documento con

document.add(image)

encajan perfectamente en el documento, sin diferencias para las diferentes configuraciones de DPI.

La respuesta de @ Stewbob funciona, pero solo está relacionada incidentalmente con los métodos de la tabla.

Lo que ocurre con iTextSharp es que se comportará de manera diferente según el constructor que utilice. Esto (de manera molesta) ampliará la imagen para llenar la celda:

PdfPCell c = new PdfPCell();
c.Add(image);
c.setHorizontalAlignment(Element.ALIGN_CENTER); // this will be ignored

Pero esto dejará la imagen en el tamaño que configuró (y permitirá la alineación):

PdfPCell c = new PdfPCell(image);  
c.setHorizontalAlignment(Element.ALIGN_CENTER);

No sé exactamente por qué es esto, tiene algo que ver con que la celda esté en ‘modo de texto’ si agrega la imagen en el constructor versus ‘modo compuesto’ si la agrega más tarde (en cuyo caso se supone que cada objeto cuidar su propia alineación).

Más información (en Java, pero aún se aplica) http://tutorials.jenkov.com/java-itext/table.html#cell-modes

Entonces, si tiene que mantener el tamaño de la imagen en el PdfPCell, puede mirar este código:

                iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageFilePath);

                 // Save the image width
                float width = image.Width;
                PdfPCell cell = new PdfPCell();
                cell.AddElement(image);


                // Now find the Image element in the cell and resize it
                foreach (IElement element in cell.CompositeElements)
                
                    // The inserted image is stored in a PdfPTable, so when you find 
                    // the table element just set the table width with the image width, and lock it.
                    PdfPTable tblImg = element as PdfPTable;
                    if (tblImg != null)
                    
                        tblImg.TotalWidth = width;
                        tblImg.LockedWidth = true;
                    
                

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *