From de01f28cce7048d96b2b37d799e9fd8d123db614 Mon Sep 17 00:00:00 2001 From: liyawei Date: Tue, 19 Jul 2022 18:45:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A4=E8=AF=81-word=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=AF=BC=E5=87=BA=E5=B7=A5=E5=85=B7=E7=B1=BB=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jero/modules/project/util/WordUtil.java | 107 ++++++++++++++---- 1 file changed, 84 insertions(+), 23 deletions(-) diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java index 3872677ca..60e6ce743 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/project/util/WordUtil.java @@ -1,14 +1,5 @@ package com.jero.modules.project.util; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import org.apache.commons.io.IOUtils; import org.docx4j.Docx4J; import org.docx4j.TraversalUtil; import org.docx4j.XmlUtils; @@ -20,23 +11,24 @@ import org.docx4j.finders.RangeFinder; import org.docx4j.fonts.IdentityPlusMapper; import org.docx4j.fonts.Mapper; import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; -import org.docx4j.wml.Body; -import org.docx4j.wml.CTBookmark; -import org.docx4j.wml.Document; -import org.docx4j.wml.Drawing; -import org.docx4j.wml.ObjectFactory; -import org.docx4j.wml.P; -import org.docx4j.wml.R; -import org.docx4j.wml.Tbl; -import org.docx4j.wml.Text; -import org.docx4j.wml.Tr; +import org.docx4j.wml.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.FileCopyUtils; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + public class WordUtil { private static final Logger log = LoggerFactory.getLogger(WordUtil.class); @@ -126,7 +118,7 @@ public class WordUtil { table.getContent().remove(rowNum - 1); } - public static void replacePicture(WordprocessingMLPackage wordMLPackage, String bookmarkName, InputStream inputStream) throws Exception { + public static void replacePicture(WordprocessingMLPackage wordMLPackage, String bookmarkName, Object text, byte[] bytes) throws Exception { try { MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); Document wmlDoc = (Document)mainDocumentPart.getJaxbElement(); @@ -139,23 +131,92 @@ public class WordUtil { while(var8.hasNext()) { CTBookmark bm = (CTBookmark)var8.next(); if (bm.getName().equals(bookmarkName)) { - byte[] bytes = IOUtils.toByteArray(inputStream); BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); Inline inline = imagePart.createImageInline("", "", 0, 1, true); - P p = (P)((P)bm.getParent()); ObjectFactory factory = new ObjectFactory(); R run = factory.createR(); Drawing drawing = factory.createDrawing(); drawing.getAnchorOrInline().add(inline); run.getContent().add(drawing); - p.getContent().add(run); + replaceTextToImage(bm, text, wordMLPackage, bytes); } } } catch (Exception var17) { + log.error(var17.getMessage(), var17); } } + /** + * 在标签处插入替换内容 + * + * @param bm + * @param object + * @throws Exception + * @author liyawei + */ + public static void replaceTextToImage(CTBookmark bm, Object object, WordprocessingMLPackage wordMLPackage , byte[] bytes) throws Exception { + if (wordMLPackage == null) { + return; + } + if (bm.getName() == null){ + return; + } + String text = object.toString(); + try { + List theList = null; + ParaRPr rpr = null; + if (bm.getParent() instanceof P) { + PPr pprTemp = ((P) (bm.getParent())).getPPr(); + if (pprTemp == null) { + rpr = null; + } else { + rpr = ((P) (bm.getParent())).getPPr().getRPr(); + } + theList = ((ContentAccessor) (bm.getParent())).getContent(); + } else { + return; + } + int rangeStart = -1; + int rangeEnd = -1; + int i = 0; + for (Object ox : theList) { + Object listEntry = XmlUtils.unwrap(ox); + if (listEntry.equals(bm)) { + if (((CTBookmark) listEntry).getName() != null) { + rangeStart = i + 1; + } + } else if (listEntry instanceof CTMarkupRange) { + if (((CTMarkupRange) listEntry).getId().equals(bm.getId())) { + rangeEnd = i - 1; + break; + } + } + i++; + } + int x = i - 1; + for (int j = x; j >= rangeStart; j--) { + theList.remove(j); + } + + BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); + Inline inline = imagePart.createImageInline("", "", 0, 1, true); + ObjectFactory factory = Context.getWmlObjectFactory(); + R run = factory.createR(); + Drawing drawing = factory.createDrawing(); + if(text != null){ + Text txt = factory.createText(); + txt.setValue(text); + run.getContent().add(txt); + } + run.getContent().add(drawing); + drawing.getAnchorOrInline().add(inline); + theList.add(rangeStart, run); + } catch (ClassCastException cce) { + + } + } + public static void replaceForTemplate(String templatePath, Map map, int tableNum, List> dataList, String outPath) throws Exception { WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(templatePath)); MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();