https://github.com/jianxiong-dev/PdfToImags
import javax.imageio.ImageIO;
import com.sun.media.imageio.plugins.tiff.BaselineTIFFTagSet;
import com.sun.media.imageio.plugins.tiff.TIFFDirectory;
import com.sun.media.imageio.plugins.tiff.TIFFField;
import com.sun.media.imageio.plugins.tiff.TIFFTag;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.TIFFEncodeParam;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.FileImageOutputStream;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
public class ImgTool {
private static final Logger log = LoggerFactory.getLogger(ImgTool.class);
/**
* 按照固定宽高原图压缩
*
* @param img
* @param width
* @param height
* @param out
* @throws IOException
*/
public static void thumbnail(String imgPath, int width, int height, String newImgPath) {
try {
log.info("ImgTool.thumbnail ========>> imgPath"+ imgPath);
BufferedImage BI = ImageIO.read(new File(imgPath));
Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.setColor(Color.RED);
g.drawImage(image, 0, 0, null); // 绘制处理后的图
g.dispose();
ImageIO.write(tag, "JPG", new FileOutputStream(new File(newImgPath)));
log.info("ImgTool.thumbnail ========>> newImgPath"+ newImgPath);
} catch (Exception e) {
log.info("ImgTool.thumbnail.error"+ e.getMessage());
e.printStackTrace();
}
}
//处理图片杂色 图片转tif
public static void replaceWithWhiteColor(String imgPath, String tifPath) {
log.info("ImgTool.replaceWithWhiteColor ==========>> imgPath "+imgPath);
log.info("ImgTool.replaceWithWhiteColor ==========>> tifPath "+tifPath);
try {
BufferedImage pngImage = ImageIO.read(new File(imgPath));
int pngWidth = pngImage.getWidth();
int pngHeight = pngImage.getHeight();
BufferedImage image = new BufferedImage(pngWidth, pngHeight,BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g = (Graphics2D) image.getGraphics();
g.drawImage(pngImage, 0, 0, pngWidth, pngHeight, null);
Iterator writers = ImageIO.getImageWritersByFormatName("TIF");
ImageWriter writer = (ImageWriter) writers.next();
RenderedImage renderedImage = image;
ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromRenderedImage(renderedImage);
IIOMetadata imageMetadata = writer.getDefaultImageMetadata(imageType, null);
imageMetadata = setDPIViaAPI(imageMetadata);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("CCITT T.6");
param.setCompressionQuality(0f);
FileImageOutputStream f = new FileImageOutputStream(new File(tifPath));
writer.setOutput(f);
writer.write(null, new IIOImage(image, null, imageMetadata), param);
image.flush();
f.flush();
f.close();
log.info("ImgTool.replaceWithWhiteColor ==========>> success ");
} catch (Exception e) {
// TODO: handle exception
log.info("ImgTool.replaceWithWhiteColor.error"+e.getMessage());
e.printStackTrace();
}
}
//处理图片杂色
public static String replaceWithWhiteColor3(BufferedImage oldImg,String newImgPath) {
log.info("ImgTool.replaceWithWhiteColor3 ==========>> newImgPath "+newImgPath);
try {
//int pngWidth = pngImage.getWidth();
int pngWidth = 2479;
//int pngHeight = pngImage.getHeight();
int pngHeight = 3508;
BufferedImage image = new BufferedImage(pngWidth, pngHeight,BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g = (Graphics2D) image.getGraphics();
g.drawImage(oldImg, 0, 0, pngWidth, pngHeight, null);
Iterator writers = ImageIO.getImageWritersByFormatName("TIF");
ImageWriter writer = (ImageWriter) writers.next();
RenderedImage renderedImage = image;
ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromRenderedImage(renderedImage);
IIOMetadata imageMetadata = writer.getDefaultImageMetadata(imageType, null);
imageMetadata = setDPIViaAPI(imageMetadata);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("CCITT T.6");
param.setCompressionQuality(0f);
FileImageOutputStream f = new FileImageOutputStream(new File(newImgPath));
writer.setOutput(f);
writer.write(null, new IIOImage(image, null, imageMetadata), param);
image.flush();
f.flush();
f.close();
log.info("ImgTool.replaceWithWhiteColor3 ==========>> success ");
return newImgPath;
} catch (Exception e) {
// TODO: handle exception
log.info("ImgTool.replaceWithWhiteColor3.error"+e.getMessage());
e.printStackTrace();
}
return null;
}
private static int DPI_X = 300;
private static int DPI_Y = 300;
static IIOMetadata setDPIViaAPI(IIOMetadata imageMetadata) throws IIOInvalidTreeException {
// Derive the TIFFDirectory from the metadata.
TIFFDirectory dir = TIFFDirectory.createFromMetadata(imageMetadata);
// Get {X,Y}Resolution tags.
BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);
// Create {X,Y}Resolution fields.
TIFFField fieldXRes = new TIFFField(tagXRes, TIFFTag.TIFF_RATIONAL, 1, new long[][] { { DPI_X, 1 } });
TIFFField fieldYRes = new TIFFField(tagYRes, TIFFTag.TIFF_RATIONAL, 1, new long[][] { { DPI_Y, 1 } });
// Append {X,Y}Resolution fields to directory.
dir.addTIFFField(fieldXRes);
dir.addTIFFField(fieldYRes);
// Convert to metadata object and return.
return dir.getAsMetadata();
}
//多张图片合成一张tif
public static String imgToTif(List<String> filesPath, String toPath, String distFileName) {
log.info("ImgTool.imgToTif ==========>> toPath "+toPath);
log.info("ImgTool.imgToTif ==========>> distFileName "+distFileName);
String env = "2";
String tempPath="";
if (filesPath != null && filesPath.size() > 0) {
File[] files = new File[filesPath.size()];
for (int i = 0; i < filesPath.size(); i++) {
files[i] = new File(filesPath.get(i));
}
if (files.length > 0) {
try {
ArrayList<PlanarImage> pages = new ArrayList<PlanarImage>(files.length - 1);
FileSeekableStream[] stream = new FileSeekableStream[files.length];
for (int i = 0; i < files.length; i++) {
stream[i] = new FileSeekableStream(files[i].getCanonicalPath());
}
PlanarImage firstPage = JAI.create("stream", stream[0]);
for (int i = 1; i < files.length; i++) {
PlanarImage page = JAI.create("stream", stream[i]);
pages.add(page);
}
TIFFEncodeParam param = new TIFFEncodeParam();
File f = new File(toPath);
if (!f.exists()) {
f.mkdirs();
}
tempPath=toPath + File.separator + distFileName;
OutputStream os = new FileOutputStream(tempPath);
ImageEncoder enc = ImageCodec.createImageEncoder("tiff", os, param);
param.setExtraImages(pages.iterator());
param.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE);// 压缩参数
param.setDeflateLevel(9);
enc.encode(firstPage);
for (int i = 0; i < files.length; i++) {
stream[i].close();
}
os.close();
if ("1".equals(env) || "2".equals(env)) {// sit,uat
log.info("ImgTool.imgToTif ==========>> test ");
} else if ("3".equals(env)) {
for (int j = 0; j < files.length; j++) {
new File(files[j].getAbsolutePath()).delete();
}
}
log.info("ImgTool.imgToTif ==========>> success ");
} catch (IOException e) {
log.info("ImgTool.imgToTif.error"+e.getMessage());
e.printStackTrace();
}
}
}
return tempPath;
}
/**
*
* @Title: createImgs
* @Description: 图片生成路径
* @param imgPath 保存图片路径
* @param imgName 图片名称
* @param i 动态图片数
* @param Type 生成类型
* @return
* @throws IOException
* @Author qinchao
* @Date 2019-6-21
*/
public synchronized static String createImgPath(String imgPath, String imgName, int i, String type) throws IOException{
log.info("PdfToImgUtil.changeImgName ===============>> imgName "+imgName);
log.info("PdfToImgUtil.changeImgName ===============>> i "+i);
if("1".equals(type)){// 保单号/单证号/保单号_单证号 +_时间戳".jpg"
return imgPath+File.separator+imgName+"_"+System.currentTimeMillis()+".jpg";
}else if("2".equals(type)){// 保单号/单证号/保单号_单证号 +_时间戳".tif"
return imgPath+File.separator+imgName+"_"+System.currentTimeMillis()+".tif";
}else if("3".equals(type)){// 保单号/单证号/保单号_单证号 +_时间戳".jpg"
return imgPath+File.separator+new StringBuilder(imgName).replace(imgName.length()-1,imgName.length(), (i+1)+"")+"_"+System.currentTimeMillis()+".jpg";
}else if("4".equals(type)){// 保单号/单证号/保单号_单证号 +_时间戳".tif"
return imgPath+File.separator+new StringBuilder(imgName).replace(imgName.length()-1,imgName.length(), (i+1)+"")+"_"+System.currentTimeMillis()+".tif";
}
return null;
}
/* public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<String>();
list.add(new File("C:\\1560945221222.jpg").getAbsolutePath());
list.add(new File("C:\\1560945219181.jpg").getAbsolutePath());
imgToTif(list, "C:\\", "a3.tif");
}
*/
}
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.RandomAccessFileOrArray;
import com.itextpdf.text.pdf.codec.TiffImage;
public class ImgToPdfUtil {
/**
*
* @Title: imgToPdf
* @Description: tif图片流转成pdf
* @param imgStream
* @param pdfFilePath
* @Author qinchao
* @Date 2018-9-29
*/
@SuppressWarnings("deprecation")
public static void imgToPdf(byte[] imgStream, String pdfFilePath){
Document docment = null;// 文档对象
try {
// 定义输出位置并把文档对象装入输出对象中
docment = new Document(PageSize.LETTER, 0, 0, 0, 0);// 创建一个文档对象
PdfWriter pdfWriter = PdfWriter.getInstance(docment, new FileOutputStream(pdfFilePath));
pdfWriter.setStrictImageSequence(true);
RandomAccessFileOrArray randomAccessFileOrArr = null;
InputStream tifFileInputStream = null;
try {
try {
tifFileInputStream = new ByteArrayInputStream(imgStream);
randomAccessFileOrArr = new RandomAccessFileOrArray(tifFileInputStream);
TiffImage.getNumberOfPages(randomAccessFileOrArr);
}catch (Exception e) {
e.printStackTrace();
throw new Exception("读取tif图片数据失败");
}finally {
if(null != tifFileInputStream){
tifFileInputStream.close();
}
}
try {
// 将tif文件读取成图片
Image tifImg = TiffImage.getTiffImage(randomAccessFileOrArr, 1);
if(null == tifImg){
throw new Exception("读取tif文件失败");
}
// 设置首页tif图片的大小
Rectangle firstpageSize = new Rectangle(tifImg.getWidth(), tifImg.getHeight());
docment.setPageSize(firstpageSize);
docment.open();// 打开文档对象
// 设置图片大小
Rectangle pageSize = new Rectangle(tifImg.getWidth(), tifImg.getHeight());
docment.setPageSize(pageSize);
tifImg.setAbsolutePosition(0, 0);// 设置图像位置
tifImg.setAlignment(Image.ALIGN_CENTER);// 设置图像的对齐方式(居中)。
docment.add(tifImg);// 加载tif图片
docment.newPage(); // 新建新的pdf页
} catch (Exception e) {
e.printStackTrace();
throw new Exception("tif文件载入pdf文件失败");
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}finally {
// 关闭
if(null != randomAccessFileOrArr){
randomAccessFileOrArr.close();
}
}
}catch (Exception e) {
e.printStackTrace();
}finally {
// 关闭文档对象,释放资源
if(null != docment){
docment.close();
}
}
}
}
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.FileImageOutputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PdfToImgUtil {
private static final Logger logger = LoggerFactory.getLogger(PdfToImgUtil.class);
/** 图片格式 */
public static final String IMG_FORMAT = "tiff";
/** 打印精度设置 */
public static final int DPI = 300; //图片的像素
/**
*
* @Title: pdfToImg
* @Description: pdf转成jpg(多页转多张图片)
* 对非图片条形处理不支持
* @param pdfPath pdf文件路径
* @param imgPath 保存图片路径
* @param imgName 图片名称规则
* @param createImageType 指定生成图片路径
* @return
* @Author qinchao
* @Date 2019-3-10
*/
public static void pdfToImg(String pdfPath,String imgPath,String imgName, String createImageType){
logger.info("PdfToImgUtil.pdfToImg ===============>> pdfPath "+pdfPath);
logger.info("PdfToImgUtil.pdfToImg ===============>> imgPath "+imgPath);
logger.info("PdfToImgUtil.pdfToImg ===============>> imgName "+imgName);
File fileImg = new File(imgPath);
if(!fileImg.exists()){
fileImg.mkdirs();
}
Document document = new Document();
try {
document.setFile(pdfPath);
} catch (Exception ex) {
ex.getStackTrace();
}
String imgNames="";
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = (BufferedImage) document.getPageImage(i,GraphicsRenderingHints.SCREEN,Page.BOUNDARY_CROPBOX, 0f, 2.5f);
RenderedImage rendImage = image;
try {
imgNames = ImgTool.createImgPath(imgPath, imgName, i, createImageType);
File file = new File(imgNames);
ImageIO.write(rendImage, "jpg", file);
}catch (IOException e){
logger.info("PdfToImgUtil.pdfToImg.error "+e.getMessage());
e.printStackTrace();
}
image.flush();
logger.info("PdfToImgUtil.pdfToImg ===============>> success "+imgNames);
}
document.dispose();
logger.info("PdfToImgUtil.pdfToImg ===============>> finish ");
}
/**
*
* @Title: pdfToImg
* @Description: pdf转成jpg(多页转多张图片)
* 对于特殊字体处理不支持
* @param pdfPath pdf文件路径
* @param imgPath 保存图片路径
* @param imgName 图片名称规则
* @param createImageType 指定生成图片路径
* @return
* @Author qinchao
* @Date 2019-3-10
*/
public static void pdfToImg2(String pdfPath,String imgPath,String imgName, String createImageType){
logger.info("PdfToImgUtil.pdfToImg ===============>> pdfPath "+pdfPath);
logger.info("PdfToImgUtil.pdfToImg ===============>> imgPath "+imgPath);
logger.info("PdfToImgUtil.pdfToImg ===============>> imgName "+imgName);
File file = new File(pdfPath);
File fileImg = new File(imgPath);
if(!fileImg.exists()){
fileImg.mkdirs();
}
try {
PDDocument doc = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
String imgNames="";
for(int i=0;i<pageCount;i++){
// BufferedImage image = renderer.renderImageWithDPI(i, 300);
BufferedImage image = renderer.renderImage(i, 2.5f);//图片像素值 图片大小
imgNames = ImgTool.createImgPath(imgPath, imgName, i, createImageType);
ImageIO.write(image, "jpg", new File(imgNames));
logger.info("PdfToImgUtil.pdfToImg ===============>> success "+imgNames);
}
} catch (Exception e) {
logger.info("PdfToImgUtil.pdfToImg.error "+e.getMessage());
e.printStackTrace();
}
logger.info("PdfToImgUtil.pdfToImg2 ===============>> finish ");
}
/**
*
* @Title: pdfToTiff
* @Description: 多页pdf转多张tif
* 对非图片条形处理不支持
* @param pdfPath pdf文件路径
* @param tifPath 保存图片路径
* @param tifName 图片名称规则
* @param createImageType 指定生成图片路径
* @Author qinchao
* @Date 2019-6-6
*/
public static void pdfToTiff(String pdfPath, String tifPath, String tifName, String createImageType) {
logger.info("PdfToImgUtil.pdfToTiff ===============>> pdfPath "+pdfPath);
logger.info("PdfToImgUtil.pdfToTiff ===============>> imgPath "+tifPath);
logger.info("PdfToImgUtil.pdfToTiff ===============>> imgName "+tifName);
File fileImg = new File(tifPath);
if(!fileImg.exists()){
fileImg.mkdirs();
}
// 定义Document,用于转换图片
Document document = new Document();
try {
document.setFile(pdfPath);
} catch (Exception ex) {
ex.printStackTrace();
}
float rotation = 0f;
int maxPages = document.getNumberOfPages();
String tifNames="";
// 循环把每页的数据转换成对应的图片
for (int i = 1; i <= maxPages; i++) {
try {
logger.info("maxPages------->" + maxPages);
logger.info(">>page>>>i------->" + i);
BufferedImage pngImage = (BufferedImage) document.getPageImage(i - 1, GraphicsRenderingHints.SCREEN, Page.BOUNDARY_CROPBOX, rotation, 4);
int pngWidth = pngImage.getWidth();
int pngHeight = pngImage.getHeight();
BufferedImage image = new BufferedImage(pngWidth, pngHeight, BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g = (Graphics2D) image.getGraphics();
g.drawImage(pngImage, 0, 0, pngWidth, pngHeight, null);
Iterator writers = ImageIO.getImageWritersByFormatName("TIF");
ImageWriter writer = (ImageWriter) writers.next();
RenderedImage renderedImage = image;
ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromRenderedImage(renderedImage);
IIOMetadata imageMetadata = writer.getDefaultImageMetadata(imageType, null);
imageMetadata = ImgTool.setDPIViaAPI(imageMetadata);
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("CCITT T.6");
param.setCompressionQuality(0f);
tifNames = ImgTool.createImgPath(tifPath, tifName, i, createImageType);
FileImageOutputStream f = new FileImageOutputStream(new File(tifNames));
writer.setOutput(f);
writer.write(null, new IIOImage(image, null, imageMetadata), param);
image.flush();
f.flush();
f.close();
logger.info("PdfToImgUtil.pdfToTiff ===============>> success "+tifNames);
} catch (Exception e) {
// TODO Auto-generated catch block
logger.info("PdfToImgUtil.pdfToTiff.error "+e.getMessage());
e.printStackTrace();
}
}
logger.info("PdfToImgUtil.pdfToTiff ===============>> finish ");
}
/**
*
* @Title: pdfToTiff2
* @Description: 多页pdf转一张tif
* 对非图片条形处理不支持
* @param pdfPath pdf文件路径
* @param tifPath 保存图片路径
* @param tifName 图片名称
* @param createImageType 指定生成图片路径
* @return
* @Author qinchao
* @Date 2019-6-6
*/
public static String pdfToTiff2(String pdfPath, String tifPath, String tifName, String createImageType) {
logger.info("PdfToImgUtil.pdfToTiff2 ===============>> pdfPath "+pdfPath);
logger.info("PdfToImgUtil.pdfToTiff2 ===============>> imgPath "+tifPath);
File fileImg = new File(tifPath);
if(!fileImg.exists()){
fileImg.mkdirs();
}
PDDocument doc = null;
FileOutputStream os = null;
String imgNames="";
String newtifFilePath="";
try {
File file = new File(pdfPath);
doc = PDDocument.load(file);
int pageCount = doc.getNumberOfPages();
PDFRenderer renderer = new PDFRenderer(doc); // 根据PDDocument对象创建pdf渲染器
List<String> list = new ArrayList<String>();
for (int i = 0; i < pageCount; i++) {
//Image image = renderer.renderImageWithDPI(i, DPI, ImageType.RGB);
BufferedImage image = renderer.renderImage(i, 10.0f);//设置图片像素
imgNames = ImgTool.createImgPath(tifPath,tifName, i, createImageType);
String img = ImgTool.replaceWithWhiteColor3(image,imgNames);//图片颜色处理
list.add(img);
}
//多张图片合成tif
newtifFilePath = ImgTool.imgToTif(list, tifPath, tifName+".tif");
logger.info("PdfToImgUtil.pdfToTiff2 ===============>> success ");
} catch (Exception e) {
logger.info("PdfToImgUtil.pdfToTiff2.error "+e.getMessage());
e.printStackTrace();
} finally {
try {
if (os != null) os.flush();
if (os != null) os.close();
if (doc != null) doc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
logger.info("PdfToImgUtil.pdfToTiff2 ===============>> finish ");
return newtifFilePath;
}
public static void main(String[] args) {
long timeMillis = System.currentTimeMillis();
System.out.println(timeMillis);
try {
//pdf2Tiff("C:\\9309011411\\9309011411.pdf", "C:\\9309011411\\test3\\9309011411.tif");
System.out.println(pdfToTiff2("C:\\9309011411\\9309011411_1010301611.pdf","C:\\9309011411\\test22\\" ,"9309011411_1010301611","3"));
//pdf2Tiff2("C:\\9309011411\\9309011411_1010306311.pdf", "C:\\9309011411\\test22\\9309011411_1010306311.tif");
//pdf2Tiff2("C:\\9309011411\\9309011411_1010601011.pdf", "C:\\9309011411\\test22\\9309011411_1010601011.tif");
//pdf2Tiff2("C:\\9309011411\\9309011411_1010601011_N.pdf", "C:\\9309011411\\test22\\9309011411_1010601011_N.tif");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(System.currentTimeMillis()-timeMillis);
}
}