Saltar al contenido

iText: Reducir la calidad de la imagen (para reducir el tamaño del PDF resultante)

Este equipo de trabajo ha pasado horas investigando para dar solución a tu pregunta, te regalamos la respuestas y deseamos resultarte de mucha ayuda.

Solución:

Escale la imagen primero, luego abra la imagen escalada con iText.

Hay un método de creación en ImageDataFactory que acepta una imagen AWT. Escale la imagen usando las herramientas AWT primero, luego ábrala así:

String imagePath = "C:\path\to\image.jpg";
java.awt.Image awtImage = ImageIO.read(new File(imagePath));

// scale image here
int scaledWidth = awtImage.getWidth(null) / 2;
int scaledHeight = awtImage.getHeight(null) / 2;
BufferedImage scaledAwtImage = new BufferedImage(scaledWidth, scaledHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = scaledAwtImage.createGraphics();
g.drawImage(awtImage, 0, 0, scaledWidth, scaledHeight, null); 
g.dispose();

/* 
Optionally pick a color to replace with transparency.
Any pixels that match this color will be replaced by tansparency.
*/
Color bgColor = Color.WHITE;

Image itextImage = new Image(ImageDataFactory.create(scaledAwtImage, bgColor));

Para obtener mejores consejos sobre cómo escalar una imagen, consulte ¿Cómo puedo cambiar el tamaño de una imagen usando Java?

Si aún necesita el tamaño original al agregarlo al PDF, vuelva a escalarlo.

itextImage.scale(2f, 2f);

Nota: Este código no está probado.


EDITAR en respuesta a los comentarios sobre la recompensa

Me tienes pensando y mirando. Parece que iText trata la importación de una imagen AWT como una imagen sin formato. Supongo que lo trata igual que un BMP, que simplemente escribe los datos de píxeles usando /FlateDecode, que probablemente sea mucho menos que óptimo. La única forma en que puedo pensar para lograr su requisito sería usar ImageIO para escribir la imagen escalada en el sistema de archivos o un ByteArrayOutputStream como jpeg, luego usar el archivo/bytes resultante para abrir con iText.

Aquí hay un ejemplo actualizado usando matrices de bytes. Si desea obtener más detalles con los niveles de compresión y demás, consulte aquí.

String imagePath = "C:\path\to\image.jpg";
java.awt.Image awtImage = ImageIO.read(new File(imagePath));

// scale image here
int scaledWidth = awtImage.getWidth(null) / 2;
int scaledHeight = awtImage.getHeight(null) / 2;
BufferedImage scaledAwtImage = new BufferedImage(scaledWidth, scaledHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = scaledAwtImage.createGraphics();
g.drawImage(awtImage, 0, 0, scaledWidth, scaledHeight, null); 
g.dispose();

ByteArrayOutputStream bout = new ByteArrayOutputStream()
ImageIO.write(scaledAwtImage, "jpeg", bout);
byte[] imageBytes = bout.toByteArray();

Image itextImage = new Image(ImageDataFactory.create(imageBytes));

Calificaciones y reseñas

Agradecemos que quieras añadir valor a nuestra información aportando tu veteranía en las ilustraciones.

¡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 *