/**
* 提取TIFF文件的指定页码,然后合成新的TIFF
*
* @param source 源文件(.tiff)
* @param target 目标文件(.tiff)
* @param pages 要提取的页码集合
*/
public static void extractAndCreateTiff(File source, File target, List<String> pages) throws Exception {
try (ImageInputStream input = new FileImageInputStream(source);
ImageOutputStream output = new FileImageOutputStream(target)) {
ImageReader reader = ImageIO.getImageReadersByFormatName(FileUtils.getSuffixName(source.getName())).next();
reader.setInput(input);
// tiff文件总页码
int totalPages = reader.getNumImages(true);
// 校验页码有效性
for (String pageStr : pages) {
int page = Integer.parseInt(pageStr);
if (page < 1 || page > totalPages) {
throw new IllegalArgumentException("页码范围需在 1 至 " + totalPages + " 之间");
}
}
ImageWriter writer = ImageIO.getImageWritersByFormatName(FileUtils.getSuffixName(source.getName())).next();
ImageWriteParam params = writer.getDefaultWriteParam();
params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
params.setCompressionType("Deflate");
writer.setOutput(output);
writer.prepareWriteSequence(null);
// 循环提取添加新文件
for (String pageStr : pages) {
int page = Integer.parseInt(pageStr);
// 页码默认从0开始,此处默认-1
BufferedImage image = reader.read(page - 1);
// 提取操作可能携带原始文件的EXIF、地理坐标等元数据到新文件38
// 需清除冗余元数据:
IIOMetadata metadata = writer.getDefaultImageMetadata(
new ImageTypeSpecifier(image), params);
writer.writeToSequence(new IIOImage(image, null, metadata), params);
}
writer.endWriteSequence();
} catch (IOException e) {
log.error("TIFF文件处理异常", e);
throw e;
}
}