排版的图片处理
This commit is contained in:
73
src/main/java/com/example/ts_obj/Util/XWPFUtils.java
Normal file
73
src/main/java/com/example/ts_obj/Util/XWPFUtils.java
Normal file
@@ -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<String> readImageInParagraph(XWPFParagraph paragraph) {
|
||||
//图片索引List
|
||||
List<String> imageBundleList = new ArrayList<String>();
|
||||
//段落中所有XWPFRun
|
||||
List<XWPFRun> 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();
|
||||
//如果子元素是<w:drawing>这样的形式,使用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();
|
||||
// 如果子元素是<pic:pic>这样的形式
|
||||
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保存图片
|
||||
//<w:object>形式
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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<String> 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<i ;j++){
|
||||
// if (StringUtils.isNotBlank(list.get(i - j).getParagraphText())){
|
||||
// lastParagraphText = list.get(i - j).getParagraphText();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// System.out.println(pictureId +"\t|" + imageName + "\t|" + lastParagraphText);
|
||||
// //获取word文本中所有的图片
|
||||
//// List<XWPFPictureData> 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<XWPFTable> 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<XWPFRun> runs = para.getRuns();
|
||||
List<XWPFRun> 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<XWPFTable> 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<XWPFParagraph> list = xdoc.getParagraphs();
|
||||
String lastParagraphText = "";
|
||||
//TODO 读取文档在数据库的内容
|
||||
|
||||
//准备一个图片名称list
|
||||
ArrayList<String> picNameList = new ArrayList<>();
|
||||
//准备一个Map key为图片名称,值为位置
|
||||
HashMap<String, String> picMap = new HashMap<>();
|
||||
|
||||
//获取图片所在位置保存
|
||||
for(int i = 0;i < list.size();i++){
|
||||
List<String> 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<i ; j++) {
|
||||
// if (StringUtils.isNotBlank(list.get(i - j).getParagraphText())) {
|
||||
// lastParagraphText = list.get(i - j).getParagraphText();
|
||||
// }
|
||||
// }
|
||||
lastParagraphText = list.get(i - 1).getParagraphText();
|
||||
if (StringUtils.isBlank(lastParagraphText)){
|
||||
for (int j = 2 ; j<i ;j++){
|
||||
if (StringUtils.isNotBlank(list.get(i - j).getParagraphText())){
|
||||
lastParagraphText = list.get(i - j).getParagraphText();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
picMap.put(imageName,lastParagraphText);
|
||||
System.out.println(pictureId +"\t|" + imageName + "\t|" + lastParagraphText);
|
||||
//获取word文本中所有的图片
|
||||
// List<XWPFPictureData> 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<XWPFParagraph> paragraphs = newXdoc.getParagraphs();
|
||||
|
||||
for (int i=0 ; i < paragraphs.size() ; i++){
|
||||
System.out.println("内容为"+paragraphs.get(i).getRuns());
|
||||
List<XWPFRun> 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) {
|
||||
|
||||
Reference in New Issue
Block a user