package com.docus.sw.souyin; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.util.FileUtils; import com.docus.sw.Config; import com.docus.sw.fenpan.Document; import com.docus.sw.fenpan.FileTypeEnum; import com.docus.sw.fenpan.Pieces; import com.docus.sw.fenpan.Roll; import com.docus.sw.word.GetPicsDocx; import com.docus.sw.word.PdfBoxUtils; import com.docus.sw.word.ReadImgDoc; import com.drew.tools.FileUtil; import com.google.gson.Gson; import org.apache.commons.imaging.ImageInfo; import org.apache.commons.imaging.ImageReadException; import org.apache.commons.imaging.Imaging; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.*; public class SuoyinService { //读取分盘后的结果。 //宗,盘,卷,件 //输出目录文件 //生成片头,片尾 //统计出需要使用的 胶片量 public static void main(String[] args) throws IOException { Config.loadConfig(); String path = "C:\\Users\\zhanghai\\Desktop\\桌面\\test\\ppp\\ppp"; new SuoyinService().index(path); } public void index(String path) throws IOException { Map map = new HashMap<>(); findAllDir(path, map); //计算出宗 //计算出每个盘的目录。 for (IndexPlate indexPlate : map.values()) { String absolutePath = indexPlate.getAbsolutePath(); File file = new File(absolutePath); File[] files = file.listFiles(); List rollList = new ArrayList<>(); //卷 for (File rollFile : files) { if (rollFile.getName().equals("片头")) { //填充卷 Roll roll = new Roll(rollFile.getName(), rollFile.getAbsolutePath()); rollList.add(roll); } else if (rollFile.getName().equals("片尾")) { //填充卷 Roll roll = new Roll(rollFile.getName(), rollFile.getAbsolutePath()); rollList.add(roll); } else { // List pieceList = new ArrayList<>(); File[] piecesFile = rollFile.listFiles(); for (File piece : piecesFile) { //区分word和pdf if (piece.getName().endsWith(".doc")) { Pieces pieces = new Pieces(FileTypeEnum.DOC, piece.getAbsolutePath(), piece.getName()); String teamName = "tempIndex/" + UUID.randomUUID(); File temp = new File(teamName); if (!temp.exists()) { temp.mkdirs(); } ReadImgDoc.readPicture(piece.getAbsolutePath(), temp.getAbsolutePath()); File[] listFiles = temp.listFiles(); genPieces(pieces, listFiles, FileTypeEnum.DOC); pieceList.add(pieces); //删除对应的temp 文件 FileUtils.delete(temp); } else if (piece.getName().endsWith(".docx")) { Pieces pieces = new Pieces(FileTypeEnum.DOCX, piece.getAbsolutePath(), piece.getName()); String teamName = "tempIndex/" + UUID.randomUUID(); File temp = new File(teamName); if (!temp.exists()) { temp.mkdirs(); } GetPicsDocx.getPics(piece.getAbsolutePath(), temp.getAbsolutePath()); File[] listFiles = temp.listFiles(); genPieces(pieces, listFiles, FileTypeEnum.DOCX); pieceList.add(pieces); //删除对应的temp 文件 FileUtils.delete(temp); } else if (piece.getName().endsWith(".pdf")) { Pieces pieces = new Pieces(FileTypeEnum.DOC, piece.getAbsolutePath(), piece.getName()); String teamName = "tempIndex/" + UUID.randomUUID(); File temp = new File(teamName); if (!temp.exists()) { temp.mkdirs(); } try { PdfBoxUtils.pdf2image(piece.getAbsolutePath(), temp.getAbsolutePath()); File[] listFiles = temp.listFiles(); genPieces(pieces, listFiles, FileTypeEnum.DOC); pieceList.add(pieces); } catch (IOException e) { } //删除对应的temp 文件 // temp.delete(); FileUtils.delete(temp); } else { Pieces pieces = new Pieces(FileTypeEnum.JPG, piece.getAbsolutePath(), piece.getName()); File[] listFiles = piece.listFiles(); genPieces(pieces, listFiles, FileTypeEnum.JPG); pieceList.add(pieces); } } //填充卷 Roll roll = new Roll(rollFile.getName(), rollFile.getAbsolutePath()); roll.putAll(pieceList); rollList.add(roll); } } indexPlate.putAll(rollList); } FileUtils.delete(new File("tempIndex")); //生成索引目录 for (IndexPlate indexPlate : map.values()) { List rollList = indexPlate.getRollList(); //计算出总size Double totalPage = 0d; for (Roll roll : rollList) { List piecesList = roll.getPiecesList(); totalPage += piecesList.size(); } Integer pianPageNum = 0; Integer totalSize = 0; for (Roll roll : rollList) { //跳过片头 if (roll.getName().equals("片头")) { continue; } //跳过片尾 if (roll.getName().equals("片尾")) { continue; } List piecesList = roll.getPiecesList(); for (Pieces pieces : piecesList) { Integer size = pieces.getDocumentList().size(); totalSize += size; } } List indexPageRows = indexGen(indexPlate, rollList, pianPageNum, totalSize); //修正数据 System.out.println(new Gson().toJson(indexPageRows)); //生成excel List mesEasyExcels = new ArrayList<>(); for (IndexPageRow indexPageRowTemp : indexPageRows) { mesEasyExcels.add(MesEasyExcel.create(indexPageRowTemp)); } EasyExcel.write(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".xls", MesEasyExcel.class).sheet("test").doWrite(mesEasyExcels); ExcelUtil.toPdf(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".xls", indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".pdf"); Integer page = PdfUtil.getPage(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".pdf"); indexPageRows = indexGen(indexPlate, rollList, page, totalSize); //修正数据 System.out.println(new Gson().toJson(indexPageRows)); //生成excel mesEasyExcels = new ArrayList<>(); for (IndexPageRow indexPageRowTemp : indexPageRows) { mesEasyExcels.add(MesEasyExcel.create(indexPageRowTemp)); } EasyExcel.write(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".xls", MesEasyExcel.class).sheet("test").doWrite(mesEasyExcels); ExcelUtil.toPdf(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".xls", indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".pdf"); //写入文件夹。 PdfToPic.toPic(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".pdf", indexPlate.getAbsolutePath() + "/片头", "01", "jpg"); PdfToPic.toPicDesc(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".pdf", indexPlate.getAbsolutePath() + "/片尾", "00", "jpg"); File pdf = new File(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".pdf"); //再重算一次索引,以及将文件进行替换。 File parentFile = pdf.getParentFile().getParentFile(); File file = new File(parentFile.getAbsolutePath() + "/" + indexPlate.getName() + ".pdf"); Files.move(pdf.toPath(), file.toPath(), StandardCopyOption.ATOMIC_MOVE); File xls = new File(indexPlate.getAbsolutePath() + "/" + indexPlate.getName() + ".xls"); //再重算一次索引,以及将文件进行替换。 File xlsParentFile = xls.getParentFile().getParentFile(); File file2 = new File(xlsParentFile.getAbsolutePath() + "/" + indexPlate.getName() + ".xls"); Files.move(xls.toPath(), file2.toPath()); //计算完整索引 List fullIndexPageRows = new ArrayList<>(); int i = 1; for (Roll roll : rollList) { List piecesList = roll.getPiecesList(); for (Pieces pieces : piecesList) { List documentList = pieces.getDocumentList(); for (Document document : documentList) { FullIndexPageRow fullIndexPageRow = new FullIndexPageRow(indexPlate.getZongName(), indexPlate.getName(), roll.getName(), pieces.getName(), document.getName(), document.isA3() ? "A3" : "A4", i); fullIndexPageRows.add(fullIndexPageRow); i++; } } } File file1 = new File(indexPlate.getAbsolutePath()); EasyExcel.write(file1.getParentFile().getAbsolutePath() + "/full-index-" + indexPlate.getName() + ".xls", FullIndexPageRow.class).sheet("test").doWrite(fullIndexPageRows); } //读取片头 //读取片尾 //生成excel //生成图片 // } private static void genPieces(Pieces pieces, File[] listFiles, FileTypeEnum fileTypeEnum) { List documentList = new ArrayList<>(); for (File docfile : listFiles) { //非图片模式,跳过。 if (!(docfile.getName().endsWith(".jpg") || docfile.getName().endsWith(".png") || docfile.getName().endsWith(".jpeg") || docfile.getName().endsWith(".tif") || docfile.getName().endsWith(".tiff") || docfile.getName().endsWith(".jp2") || docfile.getName().endsWith(".jpm")) || docfile.getName().endsWith(".gif")) { continue; } if (docfile.getName().endsWith(".jp2") || docfile.getName().endsWith(".jpm")) { // 读取 JPEG 2000 图像文件 try { BufferedImage image = ImageIO.read(docfile); int height = image.getHeight(); int width = image.getWidth(); Document document = new Document(width, height, 300, docfile.getName()); documentList.add(document); } catch (IOException e) { throw new RuntimeException(e); } } else { try { ImageInfo imageInfo = Imaging.getImageInfo(docfile); int height = imageInfo.getHeight(); int width = imageInfo.getWidth(); int physicalHeightDpi = imageInfo.getPhysicalHeightDpi(); Document document = new Document(width, height, physicalHeightDpi, docfile.getName()); documentList.add(document); } catch (IOException e) { throw new RuntimeException("非图片格式", e); } catch (ImageReadException e) { throw new RuntimeException(e); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } } pieces.put(documentList); } } private List indexGen(IndexPlate indexPlate, List rollList, Integer pianPageNum, Integer totalSize) { List indexPageRows = new ArrayList<>(); int start = 1; //添加片头 for (Roll roll : rollList) { //跳过片头 if (roll.getName().equals("片头")) { File file = new File(roll.getAbsolutePath()); int fileasize = file.listFiles().length; fileasize += pianPageNum; IndexPageRow indexPageRow = new IndexPageRow(indexPlate.getZongName(), indexPlate.getName(), roll.getName(), "", fileasize, start); start += fileasize; indexPageRows.add(indexPageRow); start += 1; } } //处理偏中 for (Roll roll : rollList) { //跳过片头 if (roll.getName().equals("片头")) { continue; } //跳过片尾 if (roll.getName().equals("片尾")) { continue; } List piecesList = roll.getPiecesList(); for (Pieces pieces : piecesList) { IndexPageRow indexPageRow = new IndexPageRow(indexPlate.getZongName(), indexPlate.getName(), roll.getName(), pieces.getName(), pieces.getDocumentList().size(), start); start += pieces.getDocumentList().size(); indexPageRows.add(indexPageRow); } start += 1; } //添加片尾 for (Roll roll : rollList) { //跳过片头 if (roll.getName().equals("片尾")) { File file = new File(roll.getAbsolutePath()); int fileasize = file.listFiles().length; fileasize += pianPageNum; IndexPageRow indexPageRow = new IndexPageRow(indexPlate.getZongName(), indexPlate.getName(), roll.getName(), "", fileasize, start); start += fileasize; indexPageRows.add(indexPageRow); start += 1; } } //加上统计 IndexPageRow indexPageRow = new IndexPageRow("", "", "", "有效画幅数", totalSize, null); indexPageRows.add(indexPageRow); return indexPageRows; } private void findAllDir(String absolutePath, Map map) { File sourceFile = new File(absolutePath); File[] files = sourceFile.listFiles(); for (File o : files) { if (o.isDirectory()) { findAllDir(o.getAbsolutePath(), map); } if (o.isFile()) { //判断是word,pdf,pic if (o.getName().endsWith(".pdf")) { File rofile = o.getParentFile().getParentFile(); // new Plate() if (map.get(rofile.getAbsolutePath()) == null) { IndexPlate indexPlate = new IndexPlate(rofile.getAbsolutePath(), rofile.getName(), rofile.getParentFile().getName()); map.put(rofile.getAbsolutePath(), indexPlate); } } else if (o.getName().endsWith(".docx") || o.getName().endsWith(".doc")) { File rofile = o.getParentFile().getParentFile(); // new Plate() if (map.get(rofile.getAbsolutePath()) == null) { IndexPlate indexPlate = new IndexPlate(rofile.getAbsolutePath(), rofile.getName(), rofile.getParentFile().getName()); map.put(rofile.getAbsolutePath(), indexPlate); } } else if (o.getName().endsWith(".jpg") || o.getName().endsWith(".png") || o.getName().endsWith(".jpeg") || o.getName().endsWith(".tif") || o.getName().endsWith(".tiff")) { if (o.getParentFile().getName().equals("片头") || o.getParentFile().getName().equals("片尾")) { continue; } //件 File parentFile = o.getParentFile() //卷 .getParentFile() //盘 .getParentFile(); if (map.get(parentFile.getAbsolutePath()) == null) { IndexPlate indexPlate = new IndexPlate(parentFile.getAbsolutePath(), parentFile.getName(), parentFile.getParentFile().getName()); map.put(parentFile.getAbsolutePath(), indexPlate); } } else { System.out.println("请删除无效的文件:" + o.getAbsolutePath()); } break; } } } }