java - iText:降低图像质量(用于减小生成的 PDF 大小)

标签 java pdf itext pdf-generation itext7

减少使用 iText 新创建的 PDF 文件中 JPEG 图像大小的最佳做法是什么? ? (我的目标是在图像质量和文件大小之间进行权衡。)

图像创建如下:

Image image = new Image(ImageDataFactory.create(imagePath))

我想提供一个比例因子,例如 0.5,它将一行中的像素数减半。

假设我用一个 3 MB 的图像生成一个 PDF。我尝试了 image.scale(0.5f, 0.5f),但生成的 PDF 文件仍然大约为 3 MB。我预计它会变得更小。

因此我猜嵌入在 PDF 文件中的源图像未被触及。但这就是我需要的:存储在磁盘上的整个 PDF 文件的像素总数应该减少。

实现此目标的最简单/推荐的方法是什么?

最佳答案

先缩放图片,然后用iText打开缩放后的图片。

ImageDataFactory 中有一个接受 AWT 图像的创建方法。先使用 AWT 工具缩放图像,然后像这样打开它:

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));

有关如何缩放图像的更好提示,请参阅 How can I resize an image using Java?

如果您在添加到 PDF 时仍需要原始尺寸,只需将其重新缩放即可。

itextImage.scale(2f, 2f);

注意:此代码未经测试。


EDIT 以回应赏金评论

你让我思考和寻找。看来 iText 将导入 AWT 图像视为原始图像。我认为它把它和 BMP 一样对待,它只是 writes the pixel data using /FlateDecode ,这可能明显低于最佳值。我能想到的实现您的要求的唯一方法是使用 ImageIO 将缩放后的图像写入文件系统或将 ByteArrayOutputStream 作为 jpeg,然后使用生成的文件/字节通过 iText 打开。

这是一个使用字节数组的更新示例。如果您想更喜欢压缩级别等,refer here .

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));

关于java - iText:降低图像质量(用于减小生成的 PDF 大小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374005/

相关文章:

java - 使用自定义标签和具有 AJAX 功能的 JSP

java - 在 JPA 中使用可嵌入 ID 持久化 OneToMany

java - 如何更改以不同显示尺寸显示 fragment 的方式?

objective-c - 如何在 objective-c 中编辑 PDF?

c#/asp.net - 如何捕获 "System.Web.HttpException: Request timed out"?

java - 字体大小未反射(reflect)在 IText 中

具有最大行的 Java JXL 异常

pdf - 使用 Ghostscript 生成缩略图可旋转我的设备尺寸定义以实现横向 pdf 页面

javascript - 使用单选按钮和复选框的 Acrobat JavaScript 计算

java - iText如何同时使用PdfWriterPipeline和PdfSmartCopy?