由于之前由tif格式的图片合成PDF太大,影响存储,所以要对之前的PDF文件进行优化,优化方法有两种:
1. 借助aspose.pdf直接对合成的PDF进行压缩,该方法对于太大的PDF容易造成内存溢出,并且速度慢。
2. 在合成PDF之前,对图片进行压缩,或者将tif格式转为压缩质量的图片格式JPEG, 推荐这种
首先介绍第一种,代码如下:
import com.aspose.pdf.Document; public class OptimizePdf { public static void optimize(String source, String target) { Document doc = new Document(source); //设置压缩属性 Document.OptimizationOptions opt = new Document.OptimizationOptions(); //删除PDF不必要的对象 opt.setRemoveUnusedObjects(true); //链接重复流 opt.setLinkDuplcateStreams(false); //删除未使用的流 opt.setRemoveUnusedStreams(false); //删除不必要的字体 opt.setUnembedFonts(true); //压缩PDF中的图片 opt.setCompressImages(true); //图片压缩比, 0 到100可选,越低压缩比越大 opt.setImageQuality(10); doc.optimizeResources(opt); //优化web的PDF文档 doc.optimize(); doc.save(target); } public static void main(String[] args) { String source = "E:/SETUP/1.pdf"; String target = "E:/SETUP/1.pdf"; optimize(source, target); } }
第二种 使用thumbnailator类库压缩图片,因为JDK的ImageIO支持的图片格式并不丰富,所以需要引入增强的twelvemonkeys的ImageIO,由于ImageIO可以自动发现,
所以引入twelvemonkeys的依赖即可,此处,由于我项目只需要tif的格式支持,为了减少多余jar,只引入了imageio-tiff,其他格式的需要依据需求可以去中央仓库找
依赖如下:
<dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> <!-- https://mvnrepository.com/artifact/com.twelvemonkeys.imageio/imageio-tiff --> <dependency> <groupId>com.twelvemonkeys.imageio</groupId> <artifactId>imageio-tiff</artifactId> <version>3.5</version> </dependency>
压缩图片的代码如下:
/** * @date 2020-7-6 * @description 压缩图片 */ public static void optimizeImage(String source, String target) { try { Thumbnails.of(source) //原图片 .scale(scale) //分辨率比例 .outputQuality(imageQuality) //图片质量 .outputFormat("JPEG") //目标文件格式 .toFile(target); //目标图片 } catch (Exception e) { e.printStackTrace(); } }
最后将压缩后图片转为PDF,可以显著的减少PDF大小。