tif图片预览。根据 @gaoxingzaq 反馈和帮助,修改tif文件的jpg、pdf模式预览功能,兼容多页tif的pdf转换、jpg转换,以及jpg在线多页预览功能。

This commit is contained in:
zhangzhen1979
2021-12-16 17:05:18 +08:00
committed by kl
parent 20f328906c
commit 48f6a507dc
2 changed files with 204 additions and 71 deletions

View File

@ -5,55 +5,129 @@ import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.lowagie.text.pdf.RandomAccessFileOrArray;
import com.lowagie.text.pdf.codec.TiffImage;
import com.sun.media.jai.codec.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import java.io.*;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ConvertPicUtil {
private final static Logger logger = LoggerFactory.getLogger(ConvertPicUtil.class);
/**
* 图片 转 JPG。
* 支持输入格式如下BMP、GIF、FlashPix、JPEG、PNG、PMN、TIFF、WBMP
* @param strInputFile 输入文件的路径和文件名
* Tif 转 JPG。
* @param strInputFile 输入文件的路径和文件名
* @param strOutputFile 输出文件的路径和文件名
* @return
* @return boolean 是否转换成功
*/
public static File convertPic2Jpg(String strInputFile, String strOutputFile) {
// 读取源图片文件
RenderedOp roInput = JAI.create("fileload", strInputFile);
public static List<String> convertTif2Jpg(String strInputFile, String strOutputFile) {
List<String> listImageFiles = new ArrayList<>();
if (strInputFile == null || "".equals(strInputFile.trim())) {
return null;
}
if (!new File(strInputFile).exists()) {
logger.info("找不到文件【" + strInputFile + "");
return null;
}
strInputFile = strInputFile.replaceAll("\\\\", "/");
strOutputFile = strOutputFile.replaceAll("\\\\", "/");
FileSeekableStream fileSeekStream = null;
try {
strOutputFile = strOutputFile.replaceAll("\\\\", "/");
File fileJpgPath = new File(strOutputFile.substring(0, strOutputFile.lastIndexOf("/")));
if(!fileJpgPath.exists()){
JPEGEncodeParam jpegEncodeParam = new JPEGEncodeParam();
TIFFEncodeParam tiffEncodeParam = new TIFFEncodeParam();
tiffEncodeParam.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
tiffEncodeParam.setLittleEndian(false);
String strFilePrefix = strInputFile.substring(strInputFile.lastIndexOf("/") + 1, strInputFile.lastIndexOf("."));
fileSeekStream = new FileSeekableStream(strInputFile);
ImageDecoder imageDecoder = ImageCodec.createImageDecoder("TIFF", fileSeekStream, null);
int intTifCount = imageDecoder.getNumPages();
logger.info("该tif文件共有【" + intTifCount + "】页");
String strJpgPath = "";
String strJpgUrl = "";
if (intTifCount == 1) {
// 如果是单页tif文件则转换的目标文件夹就在指定的位置
strJpgPath = strOutputFile.substring(0, strOutputFile.lastIndexOf("/"));
} else {
// 如果是多页tif文件则在目标文件夹下按照文件名再创建子目录将转换后的文件放入此新建的子目录中
strJpgPath = strOutputFile.substring(0, strOutputFile.lastIndexOf("."));
}
// 处理目标文件夹,如果不存在则自动创建
File fileJpgPath = new File(strJpgPath);
if (!fileJpgPath.exists()) {
fileJpgPath.mkdirs();
}
File fileJpg=new File(strOutputFile);
OutputStream ops = new FileOutputStream(fileJpg);
// 文件存储输出流
JPEGEncodeParam param = new JPEGEncodeParam();
ImageEncoder image = ImageCodec.createImageEncoder("JPEG", ops,
param); // 指定输出格式
// 解析输出流进行输出
image.encode(roInput);
// 关闭流
ops.close();
// 循环处理每页tif文件转换为jpg
for (int i = 0; i < intTifCount; i++) {
String strJpg = "";
if(intTifCount == 1){
strJpg = strJpgPath + "/" + strFilePrefix + ".jpg";
strJpgUrl = strFilePrefix + ".jpg";
}else{
strJpg = strJpgPath + "/" + i + ".jpg";
strJpgUrl = strFilePrefix + "/" + i + ".jpg";
}
return fileJpg;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
File fileJpg = new File(strJpg);
// 如果文件不存在,则生成
if(!fileJpg.exists()){
RenderedImage renderedImage = imageDecoder.decodeAsRenderedImage(i);
ParameterBlock pb = new ParameterBlock();
pb.addSource(renderedImage);
pb.add(fileJpg.toString());
pb.add("JPEG");
pb.add(jpegEncodeParam);
RenderedOp renderedOp = JAI.create("filestore", pb);
renderedOp.dispose();
logger.info("每页分别保存至: " + fileJpg.getCanonicalPath());
}else{
logger.info("JPG文件已存在 " + fileJpg.getCanonicalPath());
}
listImageFiles.add(strJpgUrl);
}
return listImageFiles;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (fileSeekStream != null) {
try {
fileSeekStream.close();
} catch (IOException e) {
}
fileSeekStream = null;
}
}
return null;
}
/**
* 将Jpg图片转换为Pdf文件
*
* @param strJpgFile 输入的jpg的路径和文件名
* @param strPdfFile 输出的pdf的路径和文件名
* @return
@ -61,7 +135,8 @@ public class ConvertPicUtil {
public static File convertJpg2Pdf(String strJpgFile, String strPdfFile) {
Document document = new Document();
// 设置文档页边距
document.setMargins(0,0,0,0);
document.setMargins(0, 0, 0, 0);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(strPdfFile);
@ -70,8 +145,8 @@ public class ConvertPicUtil {
document.open();
// 获取图片的宽高
Image image = Image.getInstance(strJpgFile);
float floatImageHeight=image.getScaledHeight();
float floatImageWidth=image.getScaledWidth();
float floatImageHeight = image.getScaledHeight();
float floatImageWidth = image.getScaledWidth();
// 设置页面宽高与图片一致
Rectangle rectangle = new Rectangle(floatImageWidth, floatImageHeight);
document.setPageSize(rectangle);
@ -101,5 +176,62 @@ public class ConvertPicUtil {
return null;
}
}
/**
* 将Tif图片转换为Pdf文件支持多页Tif
*
* @param strTifFile 输入的tif的路径和文件名
* @param strPdfFile 输出的pdf的路径和文件名
* @return
*/
public static File convertTif2Pdf(String strTifFile, String strPdfFile) {
try {
RandomAccessFileOrArray rafa = new RandomAccessFileOrArray(strTifFile);
Document document = new Document();
// 设置文档页边距
document.setMargins(0, 0, 0, 0);
PdfWriter.getInstance(document, new FileOutputStream(strPdfFile));
document.open();
int intPages = TiffImage.getNumberOfPages(rafa);
Image image;
File filePDF;
if(intPages == 1){
String strJpg = strTifFile.substring(0, strTifFile.lastIndexOf(".")) + ".jpg";
File fileJpg = new File(strJpg);
List<String> listPic2Jpg = convertTif2Jpg(strTifFile, strJpg);
if(listPic2Jpg != null && fileJpg.exists()){
filePDF = convertJpg2Pdf(strJpg, strPdfFile);
}
}else{
for (int i = 1; i <= intPages; i++) {
image = TiffImage.getTiffImage(rafa, i);
// 设置页面宽高与图片一致
Rectangle pageSize = new Rectangle(image.getScaledWidth(), image.getScaledHeight());
document.setPageSize(pageSize);
// 图片居中
image.setAlignment(Image.ALIGN_CENTER);
//新建一页添加图片
document.newPage();
document.add(image);
}
document.close();
}
rafa.close();
filePDF = new File(strPdfFile);
return filePDF;
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
}