diff --git a/src/main/java/com/example/ts_obj/Util/XWPFUtils.java b/src/main/java/com/example/ts_obj/Util/XWPFUtils.java new file mode 100644 index 0000000..e1c512e --- /dev/null +++ b/src/main/java/com/example/ts_obj/Util/XWPFUtils.java @@ -0,0 +1,73 @@ +package com.example.ts_obj.Util; + +import com.microsoft.schemas.vml.CTShape; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; +import org.apache.xmlbeans.XmlCursor; +import org.apache.xmlbeans.XmlObject; +import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject; +import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture; +import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTObject; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; +import java.util.ArrayList; +import java.util.List; + + +public class XWPFUtils { + //获取某一个段落中的所有图片索引 + public static List readImageInParagraph(XWPFParagraph paragraph) { + //图片索引List + List imageBundleList = new ArrayList(); + //段落中所有XWPFRun + List runList = paragraph.getRuns(); + for (XWPFRun run : runList) { + //XWPFRun是POI对xml元素解析后生成的自己的属性,无法通过xml解析,需要先转化成CTR + CTR ctr = run.getCTR(); + //对子元素进行遍历 + XmlCursor c = ctr.newCursor(); + //这个就是拿到所有的子元素: + c.selectPath("./*"); + while (c.toNextSelection()) { + XmlObject o = c.getObject(); + //如果子元素是这样的形式,使用CTDrawing保存图片 + if (o instanceof CTDrawing) { + CTDrawing drawing = (CTDrawing) o; + CTInline[] ctInlines = drawing.getInlineArray(); + for (CTInline ctInline : ctInlines) { + CTGraphicalObject graphic = ctInline.getGraphic(); + // + XmlCursor cursor = graphic.getGraphicData().newCursor(); + cursor.selectPath("./*"); + while (cursor.toNextSelection()) { + XmlObject xmlObject = cursor.getObject(); + // 如果子元素是这样的形式 + if (xmlObject instanceof CTPicture) { + org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture picture = (org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture) xmlObject; + //拿到元素的属性 + imageBundleList.add(picture.getBlipFill().getBlip().getEmbed()); + } + } + } + } + //使用CTObject保存图片 + //形式 + if (o instanceof CTObject) { + CTObject object = (CTObject) o; + System.out.println(object); + XmlCursor w = object.newCursor(); + w.selectPath("./*"); + while (w.toNextSelection()) { + XmlObject xmlObject = w.getObject(); + if (xmlObject instanceof CTShape) { + CTShape shape = (CTShape) xmlObject; + imageBundleList.add(shape.getImagedataArray()[0].getId2()); + } + } + } + } + } + return imageBundleList; + } +} diff --git a/src/main/java/com/example/ts_obj/controller/TypesetController.java b/src/main/java/com/example/ts_obj/controller/TypesetController.java index a0c3e79..04c9b90 100644 --- a/src/main/java/com/example/ts_obj/controller/TypesetController.java +++ b/src/main/java/com/example/ts_obj/controller/TypesetController.java @@ -4,12 +4,11 @@ import com.alibaba.fastjson.JSON; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.*; -import com.deepoove.poi.data.style.BorderStyle; import com.deepoove.poi.data.style.Style; -import com.deepoove.poi.data.style.TableStyle; import com.deepoove.poi.policy.ParagraphRenderPolicy; import com.example.ts_obj.Util.CustomTableRenderPolicy; import com.example.ts_obj.Util.Util; +import com.example.ts_obj.Util.XWPFUtils; import com.example.ts_obj.bean.ReturnCodeAndMsgEnum; import com.example.ts_obj.bean.ReturnValue; import com.example.ts_obj.entity.Typeset; @@ -18,11 +17,14 @@ import com.example.ts_obj.entity.TypesetInfoReference; import com.example.ts_obj.entity.User; import com.example.ts_obj.service.TypesetService; import com.example.ts_obj.service.UserService; -import com.google.common.collect.Maps; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.openxml4j.util.ZipSecureFile; +import org.apache.poi.util.Units; import org.apache.poi.xwpf.usermodel.*; +import org.apache.xmlbeans.XmlCursor; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +44,8 @@ public class TypesetController { private final static Logger logger = LoggerFactory.getLogger(UserController.class); - private String BASE_DIR="d:/upload/"; + private String BASE_DIR="E:/upload/"; + private static String NEW_BASE_DIR="E:/upload/20220520/"; // private String BASE_DIR = "/home/wwwroot/ts.tmrjournals.com/upload/"; @Autowired private TypesetService typesetservice; @@ -204,6 +207,48 @@ public class TypesetController { } } } +// String lastParagraphText = ""; +// //读取文档在数据库的内容 +// +// +// //获取图片所在位置保存 +// for(int i = 0;i < list.size();i++){ +// List imageBundleList = XWPFUtils.readImageInParagraph(list.get(i)); +// if(CollectionUtils.isNotEmpty(imageBundleList)){ +// for(String pictureId:imageBundleList){ +// XWPFPictureData pictureData = xdoc.getPictureDataByID(pictureId); +// String imageName = pictureData.getFileName(); +// lastParagraphText = list.get(i - 1).getParagraphText(); +// if (StringUtils.isBlank(lastParagraphText)){ +// for (int j = 2 ; j allPictures = xdoc.getAllPictures(); +// //遍历照片 +//// for (XWPFPictureData picture: allPictures) { +// byte[] data = pictureData.getData(); +// File filePicture = new File("C:\\Users\\yl\\Desktop\\pictures\\" + imageName.replace("image","")); +// if (!filePicture.exists()){ +// if (filePicture.getParentFile().exists()) { +// filePicture.getParentFile().mkdirs(); +// } +// filePicture.createNewFile(); +// } +// FileOutputStream fileOutputStream = new FileOutputStream(filePicture); +// fileOutputStream.write(data,0,data.length); +// fileOutputStream.close(); +// System.out.println("执行结束了"); +//// } +// } +// } +// } + // List tables = xdoc.getTables(); // for (XWPFTable table : tables) { @@ -256,7 +301,9 @@ public class TypesetController { // } // } // Boolean bold = false; - for (XWPFParagraph para : list) { + for (int i=0 ; i < list.size() ; i++){ +// for (XWPFParagraph para : list) { + System.out.println("内容为"+list.get(i).getRuns()); // ArrayList cac_al = new ArrayList();//加粗 // ArrayList cac_it = new ArrayList();//斜体 // String cache = para.getText().trim(); @@ -264,11 +311,30 @@ public class TypesetController { // if(cache.trim().toUpperCase().equals("ABSTRACT")){ // bold = true; // } - List runs = para.getRuns(); + List runs = list.get(i).getRuns(); + String replace = String.valueOf(runs).replace(",", "").replace(" ",""); + if (replace.contains("Objective. A comprehensive and updated systematic review is needed to evaluate the effectiveness and safety of HuangQiXiXin decoction (HQXXD) for cough variant asthma (CVA). The aim of this systematic review protocol is to comprehensively assess the effectiveness and safety of HQXXD for CVA. Methods. An overall search for studies in main English and Chinese electronic databases from their inception to January 2021 will be performed. Randomized controlled trials (RCTs) regarding HQXXD for CVA will be included. We will use RevMan 5.3 software to perform statistical analysis and meta-analysis. Results. The findings of this systematic review will be disseminated through peer-reviewed publications. Conclusion. The systematic review will provide more evidence regarding the effectiveness and safety of HQXXD for CVA.".replace(",","").replace(" ",""))){ + System.out.println("确实包含"); +// for (int r=0 ; r < runs.size() ; r++){ +// runs.get(r); +// +// } + //获取光标 + XmlCursor xmlCursor = list.get(i+1).getCTP().newCursor(); + XWPFParagraph xwpfParagraph = xdoc.insertNewParagraph(xmlCursor); + XWPFRun run = xwpfParagraph.createRun(); +// run.setText("{{@image}}"); + FileInputStream inputStream = new FileInputStream("C:\\Users\\yl\\Desktop\\pictures\\1.png"); + run.addPicture(inputStream,XWPFDocument.PICTURE_TYPE_JPEG,"1.jgp", Units.toEMU(180),Units.toEMU(180)); + } + + + for (XWPFRun r : runs) { // if(!bold){ // break; // } + String cach = ""; if (r.getText(0) == null) { @@ -306,6 +372,14 @@ public class TypesetController { // } al.add(cache); } + + FileOutputStream os = new FileOutputStream("C:\\Users\\yl\\Desktop\\pictures\\1.doc"); + xdoc.write(os); + System.out.println("输出完毕"); + + //获取word文本中的所有表格 +// Iterator tablesIterator = xdoc.getTablesIterator(); + } catch (Exception e) { e.getStackTrace(); } @@ -608,6 +682,110 @@ public class TypesetController { return p; } + @ApiOperation(value = "生成图片") + @RequestMapping("/addPic") + public ReturnValue addPic(String OldFileName,String newFileName){ + //1.操作初始文档获取图片 和 图片所在的位置 + try { + File file = new File(this.BASE_DIR + OldFileName); + FileInputStream fis = new FileInputStream(file); + XWPFDocument xdoc = new XWPFDocument(fis); + List list = xdoc.getParagraphs(); + String lastParagraphText = ""; + //TODO 读取文档在数据库的内容 + + //准备一个图片名称list + ArrayList picNameList = new ArrayList<>(); + //准备一个Map key为图片名称,值为位置 + HashMap picMap = new HashMap<>(); + + //获取图片所在位置保存 + for(int i = 0;i < list.size();i++){ + List imageBundleList = XWPFUtils.readImageInParagraph(list.get(i)); + if(CollectionUtils.isNotEmpty(imageBundleList)){ + for(String pictureId:imageBundleList){ + XWPFPictureData pictureData = xdoc.getPictureDataByID(pictureId); + String imageName = pictureData.getFileName(); + picNameList.add(imageName); +// for (int j=1; j allPictures = xdoc.getAllPictures(); + //遍历照片 +// for (XWPFPictureData picture: allPictures) { + byte[] data = pictureData.getData(); + File filePicture = new File("C:\\Users\\yl\\Desktop\\pictures\\" + imageName.replace("image","")); + if (!filePicture.exists()){ + if (filePicture.getParentFile().exists()) { + filePicture.getParentFile().mkdirs(); + } + filePicture.createNewFile(); + } + FileOutputStream fileOutputStream = new FileOutputStream(filePicture); + fileOutputStream.write(data,0,data.length); + fileOutputStream.close(); + System.out.println("执行结束了"); +// } + } + } + } + System.out.println("picNameList===========>"+picNameList); + System.out.println("picMap===========>"+picMap); + //2.获取按模板新生成的文档添加图片 + File newFile = new File(this.NEW_BASE_DIR + newFileName); + FileInputStream newFis = new FileInputStream(newFile); + XWPFDocument newXdoc = new XWPFDocument(newFis); + List paragraphs = newXdoc.getParagraphs(); + + for (int i=0 ; i < paragraphs.size() ; i++){ + System.out.println("内容为"+paragraphs.get(i).getRuns()); + List runs = paragraphs.get(i).getRuns(); + String replace = String.valueOf(runs).replace(",", "").replace(" ",""); + for (String pic: picNameList){ + if (replace.contains(picMap.get(pic).replace(",","").replace(" ",""))){ + System.out.println("包含执行了"); + //获取光标 + XmlCursor xmlCursor = paragraphs.get(i+1).getCTP().newCursor(); + XWPFParagraph xwpfParagraph = newXdoc.insertNewParagraph(xmlCursor); + + XWPFRun run = xwpfParagraph.createRun(); + run.addBreak(BreakClear.ALL); +// run.setText("{{@image}}"); + FileInputStream inputStream = new FileInputStream("C:\\Users\\yl\\Desktop\\pictures\\"+pic.replace("image","")); + run.addPicture(inputStream,XWPFDocument.PICTURE_TYPE_JPEG,pic, Units.toEMU(500),Units.toEMU(180)); + // + } + } + + } + FileOutputStream os = new FileOutputStream("C:\\Users\\yl\\Desktop\\pictures\\New.doc"); + newXdoc.write(os); + System.out.println("输出完毕"); + os.close(); + fis.close(); + newFis.close(); + }catch (Exception e){ + e.printStackTrace(); + } + return new ReturnValue(ReturnCodeAndMsgEnum.Success); + } + + + @ApiOperation(value = "存储上传过的文件名") @PostMapping("/savefilename") public ReturnValue saveFileName(Long typesetId, String filename) {