流程代码

This commit is contained in:
zhal 2022-07-07 17:54:54 +08:00
parent b54b65bc53
commit d733d7bd40
2 changed files with 61 additions and 129 deletions

View File

@ -1,13 +1,10 @@
/*
package com.actionsoft.apps.coe.pal.datamigration.util.htmltodocx; package com.actionsoft.apps.coe.pal.datamigration.util.htmltodocx;
*/
/** /**
* @author baizp * @author baizp
* @Description: * @Description:
* @date 2022/6/24 16:01 * @date 2022/6/24 16:01
*//* */
import org.docx4j.dml.wordprocessingDrawing.Inline; import org.docx4j.dml.wordprocessingDrawing.Inline;
import org.docx4j.jaxb.Context; import org.docx4j.jaxb.Context;
@ -31,26 +28,22 @@ import java.io.*;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.List; import java.util.List;
*/
/** /**
* @program: htmltoword * @program: htmltoword
* @description: html docx * @description: html docx
* @author: corey * @author: corey
* @create: 2020-04-29 14:10 * @create: 2020-04-29 14:10
**//* **/
public class HtmlToWord { public class HtmlToWord {
private static ObjectFactory factory; private static ObjectFactory factory;
private static WordprocessingMLPackage wordMLPackage; private static WordprocessingMLPackage wordMLPackage;
*/ /**
/**
* 将一段富文本字符串转为一个字节数组 * 将一段富文本字符串转为一个字节数组
* *
* @param data * @param data
* @return * @return
*//* */
public static byte[] resolveHtml(String data) { public static byte[] resolveHtml(String data) {
Document document = Jsoup.parseBodyFragment(data, "UTF-8"); Document document = Jsoup.parseBodyFragment(data, "UTF-8");
ByteArrayOutputStream out = null; ByteArrayOutputStream out = null;
@ -151,28 +144,20 @@ public class HtmlToWord {
public static void setNum1(int level,P p){ public static void setNum1(int level,P p){
*/ /*ObjectFactory factory = new org.docx4j.wml.ObjectFactory();
/*ObjectFactory factory = new org.docx4j.wml.ObjectFactory(); P p = factory.createP();*/
P p = factory.createP();*//*
/*org.docx4j.wml.Text t = factory.createText();
t.setValue(em.text());*/
*/ /*org.docx4j.wml.R run = factory.createR();
/*org.docx4j.wml.Text t = factory.createText();
t.setValue(em.text());*//*
*/
/*org.docx4j.wml.R run = factory.createR();
run.getContent().add(t); run.getContent().add(t);
p.getContent().add(run);*//* p.getContent().add(run);*/
/*org.docx4j.wml.PPr ppr = factory.createPPr();
*/ p.setPPr(ppr);*/
/*org.docx4j.wml.PPr ppr = factory.createPPr();
p.setPPr(ppr);*//*
org.docx4j.wml.PPr ppr =p.getPPr(); org.docx4j.wml.PPr ppr =p.getPPr();
// Create and add <w:numPr> // Create and add <w:numPr>
PPrBase.NumPr numPr = factory.createPPrBaseNumPr(); PPrBase.NumPr numPr = factory.createPPrBaseNumPr();
@ -191,16 +176,14 @@ public class HtmlToWord {
//wordMLPackage.getMainDocumentPart().addObject(p); //wordMLPackage.getMainDocumentPart().addObject(p);
} }
*/ /**
/**
* @param @param text * @param @param text
* @param @return 设定文件 * @param @return 设定文件
* @return P 返回类型 * @return P 返回类型
* @throws * @throws
* @Title: addParapraph * @Title: addParapraph
* @Description: (文本转段落) * @Description: (文本转段落)
*//* */
private static P addParapraph(String text) { private static P addParapraph(String text) {
factory = Context.getWmlObjectFactory(); factory = Context.getWmlObjectFactory();
P paragraph = factory.createP(); P paragraph = factory.createP();
@ -214,15 +197,13 @@ public class HtmlToWord {
return paragraph; return paragraph;
} }
*/ /**
/**
* @param @param p * @param @param p
* @param @param str 设定文件 * @param @param str 设定文件
* @return void 返回类型 * @return void 返回类型
* @throws * @throws
* @Title: setFirstLine * @Title: setFirstLine
*//* */
private static void setFirstLine(P p, String str) { private static void setFirstLine(P p, String str) {
PPr ppr = getPPr(p); PPr ppr = getPPr(p);
Ind ind = ppr.getInd(); Ind ind = ppr.getInd();
@ -244,11 +225,9 @@ public class HtmlToWord {
return ppr; return ppr;
} }
*/ /**
/**
* table @param @return 设定文件 @return Tbl 返回类型 @throws * table @param @return 设定文件 @return Tbl 返回类型 @throws
*//* */
private static Tbl addTable(Element table) { private static Tbl addTable(Element table) {
factory = Context.getWmlObjectFactory(); factory = Context.getWmlObjectFactory();
Tbl tbl = factory.createTbl(); Tbl tbl = factory.createTbl();
@ -261,11 +240,9 @@ public class HtmlToWord {
return tbl; return tbl;
} }
*/ /**
/**
* tr @param @return 设定文件 @return Tr 返回类型 @throws * tr @param @return 设定文件 @return Tr 返回类型 @throws
*//* */
private static Tr addTableTr(Element tr) { private static Tr addTableTr(Element tr) {
Elements tds = tr.getElementsByTag("th").isEmpty() ? tr.getElementsByTag("td") : tr.getElementsByTag("th"); Elements tds = tr.getElementsByTag("th").isEmpty() ? tr.getElementsByTag("td") : tr.getElementsByTag("th");
Tr ftr = factory.createTr(); Tr ftr = factory.createTr();
@ -278,11 +255,9 @@ public class HtmlToWord {
return ftr; return ftr;
} }
*/ /**
/**
* 本方法创建一个单元格属性集对象和一个表格宽度对象. 将给定的宽度设置到宽度对象然后将其添加到 属性集对象. 最后将属性集对象设置到单元格中. * 本方法创建一个单元格属性集对象和一个表格宽度对象. 将给定的宽度设置到宽度对象然后将其添加到 属性集对象. 最后将属性集对象设置到单元格中.
*//* */
private static void setCellWidth(Tc tableCell, int width) { private static void setCellWidth(Tc tableCell, int width) {
TcPr tableCellProperties = new TcPr(); TcPr tableCellProperties = new TcPr();
TblWidth tableWidth = new TblWidth(); TblWidth tableWidth = new TblWidth();
@ -291,11 +266,9 @@ public class HtmlToWord {
tableCell.setTcPr(tableCellProperties); tableCell.setTcPr(tableCellProperties);
} }
*/ /**
/**
* 本方法为表格添加边框 * 本方法为表格添加边框
*//* */
private static void addBorders(Tbl table) { private static void addBorders(Tbl table) {
table.setTblPr(new TblPr()); table.setTblPr(new TblPr());
CTBorder border = new CTBorder(); CTBorder border = new CTBorder();
@ -314,16 +287,14 @@ public class HtmlToWord {
table.getTblPr().setTblBorders(borders); table.getTblPr().setTblBorders(borders);
} }
*/ /**
/**
* 将图片从文件对象转换成字节数组. * 将图片从文件对象转换成字节数组.
* *
* @param file 将要转换的文件 * @param file 将要转换的文件
* @return 包含图片字节数据的字节数组 * @return 包含图片字节数据的字节数组
* @throws FileNotFoundException * @throws FileNotFoundException
* @throws IOException * @throws IOException
*//* */
private static byte[] convertImageToByteArray(File file) throws FileNotFoundException, IOException { private static byte[] convertImageToByteArray(File file) throws FileNotFoundException, IOException {
InputStream is = new FileInputStream(file); InputStream is = new FileInputStream(file);
long length = file.length(); long length = file.length();
@ -345,8 +316,7 @@ public class HtmlToWord {
return bytes; return bytes;
} }
*/ /**
/**
* Docx4j拥有一个由字节数组创建图片部件的工具方法, 随后将其添加到给定的包中. 为了能将图片添加 到一个段落中, 我们需要将图片转换成内联对象. * Docx4j拥有一个由字节数组创建图片部件的工具方法, 随后将其添加到给定的包中. 为了能将图片添加 到一个段落中, 我们需要将图片转换成内联对象.
* 这也有一个方法, 方法需要文件名提示, 替换文本, 两个id标识符和一个是嵌入还是链接到的指示作为参数. 一个id用于文档中绘图对象不可见的属性, * 这也有一个方法, 方法需要文件名提示, 替换文本, 两个id标识符和一个是嵌入还是链接到的指示作为参数. 一个id用于文档中绘图对象不可见的属性,
* 另一个id用于图片本身不可见的绘制属性. 最后我们将内联 对象添加到段落中并将段落添加到包的主文档部件. * 另一个id用于图片本身不可见的绘制属性. 最后我们将内联 对象添加到段落中并将段落添加到包的主文档部件.
@ -354,8 +324,7 @@ public class HtmlToWord {
* @param wordMLPackage 要添加图片的包 * @param wordMLPackage 要添加图片的包
* @param bytes 图片对应的字节数组 * @param bytes 图片对应的字节数组
* @throws Exception 不幸的createImageInline方法抛出一个异常(没有更多具体的异常类型) * @throws Exception 不幸的createImageInline方法抛出一个异常(没有更多具体的异常类型)
*//* */
private static void addImageToPackage(WordprocessingMLPackage wordMLPackage, byte[] bytes) throws Exception { private static void addImageToPackage(WordprocessingMLPackage wordMLPackage, byte[] bytes) throws Exception {
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes); BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
@ -368,15 +337,13 @@ public class HtmlToWord {
wordMLPackage.getMainDocumentPart().addObject(paragraph); wordMLPackage.getMainDocumentPart().addObject(paragraph);
} }
*/ /**
/**
* 创建一个对象工厂并用它创建一个段落和一个可运行块R. 然后将可运行块添加到段落中. 接下来创建一个图画并将其添加到可运行块R中. 最后我们将内联 * 创建一个对象工厂并用它创建一个段落和一个可运行块R. 然后将可运行块添加到段落中. 接下来创建一个图画并将其添加到可运行块R中. 最后我们将内联
* 对象添加到图画中并返回段落对象. * 对象添加到图画中并返回段落对象.
* *
* @param inline 包含图片的内联对象. * @param inline 包含图片的内联对象.
* @return 包含图片的段落 * @return 包含图片的段落
*//* */
private static P addInlineImageToParagraph(Inline inline) { private static P addInlineImageToParagraph(Inline inline) {
// 添加内联对象到一个段落中 // 添加内联对象到一个段落中
ObjectFactory factory = new ObjectFactory(); ObjectFactory factory = new ObjectFactory();
@ -389,8 +356,7 @@ public class HtmlToWord {
return paragraph; return paragraph;
} }
*/ /**
/**
* This method alters the default style sheet that is part of each document. * This method alters the default style sheet that is part of each document.
* <p> * <p>
* To do this, we first retrieve the style sheet from the package and then get * To do this, we first retrieve the style sheet from the package and then get
@ -399,8 +365,7 @@ public class HtmlToWord {
* the alterations if applicable. * the alterations if applicable.
* *
* @param * @param
*//* */
public static void alterStyleSheet() { public static void alterStyleSheet() {
StyleDefinitionsPart styleDefinitionsPart = wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart(); StyleDefinitionsPart styleDefinitionsPart = wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart();
Styles styles = null; Styles styles = null;
@ -424,14 +389,12 @@ public class HtmlToWord {
} }
} }
*/ /**
/**
* First we create a run properties object as we want to remove nearly all of * First we create a run properties object as we want to remove nearly all of
* the existing styling. Then we change the font and font size and set the run * the existing styling. Then we change the font and font size and set the run
* properties on the given style. As in previous examples, the font size is * properties on the given style. As in previous examples, the font size is
* defined to be in half-point size. * defined to be in half-point size.
*//* */
private static void alterNormalStyle(Style style) { private static void alterNormalStyle(Style style) {
// we want to change (or remove) almost all the run properties of the // we want to change (or remove) almost all the run properties of the
// normal style, so we create a new one. // normal style, so we create a new one.
@ -441,20 +404,16 @@ public class HtmlToWord {
style.setRPr(rpr); style.setRPr(rpr);
} }
*/ /**
/**
* For this style, we get the existing run properties from the style and remove * For this style, we get the existing run properties from the style and remove
* the theme font information from them. Then we also remove the bold styling, * the theme font information from them. Then we also remove the bold styling,
* change the font size (half-points) and add an underline. * change the font size (half-points) and add an underline.
*//* */
private static void alterHeading1Style(Style style) { private static void alterHeading1Style(Style style) {
RPr rpr = getRunPropertiesAndRemoveThemeInfo(style); RPr rpr = getRunPropertiesAndRemoveThemeInfo(style);
removeBoldStyle(rpr); removeBoldStyle(rpr);
changeFontSize(rpr, 28); changeFontSize(rpr, 28);
*/ /* addUnderline(rpr); */
/* addUnderline(rpr); *//*
} }
private static void alterHeading2Style(Style style) { private static void alterHeading2Style(Style style) {
@ -462,9 +421,7 @@ public class HtmlToWord {
removeBoldStyle(rpr); removeBoldStyle(rpr);
changeFontSize(rpr, 24); changeFontSize(rpr, 24);
*/ /* addUnderline(rpr); */
/* addUnderline(rpr); *//*
} }
private static RPr getRunPropertiesAndRemoveThemeInfo(Style style) { private static RPr getRunPropertiesAndRemoveThemeInfo(Style style) {
@ -475,8 +432,7 @@ public class HtmlToWord {
return rpr; return rpr;
} }
*/ /**
/**
* Change the font of the given run properties to Arial. * Change the font of the given run properties to Arial.
* <p> * <p>
* A run font specifies the fonts which shall be used to display the contents of * A run font specifies the fonts which shall be used to display the contents of
@ -485,8 +441,7 @@ public class HtmlToWord {
* properties. * properties.
* *
* @param runProperties * @param runProperties
*//* */
private static void changeFontToArial(RPr runProperties) { private static void changeFontToArial(RPr runProperties) {
RFonts runFont = new RFonts(); RFonts runFont = new RFonts();
runFont.setAscii("Arial"); runFont.setAscii("Arial");
@ -494,55 +449,47 @@ public class HtmlToWord {
runProperties.setRFonts(runFont); runProperties.setRFonts(runFont);
} }
*/ /**
/**
* Change the font size of the given run properties to the given value. * Change the font size of the given run properties to the given value.
* *
* @param runProperties * @param runProperties
* @param fontSize Twice the size needed, as it is specified as half-point value * @param fontSize Twice the size needed, as it is specified as half-point value
*//* */
private static void changeFontSize(RPr runProperties, int fontSize) { private static void changeFontSize(RPr runProperties, int fontSize) {
HpsMeasure size = new HpsMeasure(); HpsMeasure size = new HpsMeasure();
size.setVal(BigInteger.valueOf(fontSize)); size.setVal(BigInteger.valueOf(fontSize));
runProperties.setSz(size); runProperties.setSz(size);
} }
*/ /**
/**
* Removes the theme font information from the run properties. If this is not * Removes the theme font information from the run properties. If this is not
* removed then the styles based on the normal style won't inherit the Arial * removed then the styles based on the normal style won't inherit the Arial
* font from the normal style. * font from the normal style.
* *
* @param runProperties * @param runProperties
*//* */
private static void removeThemeFontInformation(RPr runProperties) { private static void removeThemeFontInformation(RPr runProperties) {
runProperties.getRFonts().setAsciiTheme(null); runProperties.getRFonts().setAsciiTheme(null);
runProperties.getRFonts().setHAnsiTheme(null); runProperties.getRFonts().setHAnsiTheme(null);
} }
*/ /**
/**
* Removes the Bold styling from the run properties. * Removes the Bold styling from the run properties.
* *
* @param runProperties * @param runProperties
*//* */
private static void removeBoldStyle(RPr runProperties) { private static void removeBoldStyle(RPr runProperties) {
runProperties.getB().setVal(false); runProperties.getB().setVal(false);
} }
*/ /**
/**
* As in the previous example, this method creates a footer part and adds it to * As in the previous example, this method creates a footer part and adds it to
* the main document and then returns the corresponding relationship. * the main document and then returns the corresponding relationship.
* *
* @return * @return
* @throws InvalidFormatException * @throws InvalidFormatException
*//* */
private static Relationship createFooterPart() throws InvalidFormatException { private static Relationship createFooterPart() throws InvalidFormatException {
FooterPart footerPart = new FooterPart(); FooterPart footerPart = new FooterPart();
footerPart.setPackage(wordMLPackage); footerPart.setPackage(wordMLPackage);
@ -552,8 +499,7 @@ public class HtmlToWord {
return wordMLPackage.getMainDocumentPart().addTargetPart(footerPart); return wordMLPackage.getMainDocumentPart().addTargetPart(footerPart);
} }
*/ /**
/**
* As in the previous example, we create a footer and a paragraph object. But * As in the previous example, we create a footer and a paragraph object. But
* this time, instead of adding text to a run, we add a field. And just as with * this time, instead of adding text to a run, we add a field. And just as with
* the table of content, we have to add a begin and end character around the * the table of content, we have to add a begin and end character around the
@ -561,8 +507,7 @@ public class HtmlToWord {
* content of the footer and then return it. * content of the footer and then return it.
* *
* @return * @return
*//* */
public static Ftr createFooterWithPageNr() { public static Ftr createFooterWithPageNr() {
Ftr ftr = factory.createFtr(); Ftr ftr = factory.createFtr();
P paragraph = factory.createP(); P paragraph = factory.createP();
@ -575,8 +520,7 @@ public class HtmlToWord {
return ftr; return ftr;
} }
*/ /**
/**
* Creating the page number field is nearly the same as creating the field in * Creating the page number field is nearly the same as creating the field in
* the TOC example. The only difference is in the value. We use the PAGE * the TOC example. The only difference is in the value. We use the PAGE
* command, which prints the number of the current page, together with the * command, which prints the number of the current page, together with the
@ -584,8 +528,7 @@ public class HtmlToWord {
* preserved when the field is updated. * preserved when the field is updated.
* *
* @param paragraph * @param paragraph
*//* */
private static void addPageNumberField(P paragraph) { private static void addPageNumberField(P paragraph) {
R run = factory.createR(); R run = factory.createR();
Text txt = new Text(); Text txt = new Text();
@ -595,14 +538,12 @@ public class HtmlToWord {
paragraph.getContent().add(run); paragraph.getContent().add(run);
} }
*/ /**
/**
* Every fields needs to be delimited by complex field characters. This method * Every fields needs to be delimited by complex field characters. This method
* adds the delimiter that precedes the actual field to the given paragraph. * adds the delimiter that precedes the actual field to the given paragraph.
* *
* @param paragraph * @param paragraph
*//* */
private static void addFieldBegin(P paragraph) { private static void addFieldBegin(P paragraph) {
R run = factory.createR(); R run = factory.createR();
FldChar fldchar = factory.createFldChar(); FldChar fldchar = factory.createFldChar();
@ -611,14 +552,12 @@ public class HtmlToWord {
paragraph.getContent().add(run); paragraph.getContent().add(run);
} }
*/ /**
/**
* Every fields needs to be delimited by complex field characters. This method * Every fields needs to be delimited by complex field characters. This method
* adds the delimiter that follows the actual field to the given paragraph. * adds the delimiter that follows the actual field to the given paragraph.
* *
* @param paragraph * @param paragraph
*//* */
private static void addFieldEnd(P paragraph) { private static void addFieldEnd(P paragraph) {
FldChar fldcharend = factory.createFldChar(); FldChar fldcharend = factory.createFldChar();
fldcharend.setFldCharType(STFldCharType.END); fldcharend.setFldCharType(STFldCharType.END);
@ -627,14 +566,12 @@ public class HtmlToWord {
paragraph.getContent().add(run3); paragraph.getContent().add(run3);
} }
*/ /**
/**
* This method fetches the document final section properties, and adds a newly * This method fetches the document final section properties, and adds a newly
* created footer reference to them. * created footer reference to them.
* *
* @param relationship * @param relationship
*//* */
public static void createFooterReference(Relationship relationship) { public static void createFooterReference(Relationship relationship) {
List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections(); List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections();
@ -653,13 +590,11 @@ public class HtmlToWord {
sectPr.getEGHdrFtrReferences().add(footerReference); sectPr.getEGHdrFtrReferences().add(footerReference);
} }
*/ /**
/**
* Adds a page break to the document. * Adds a page break to the document.
* *
* @param documentPart * @param documentPart
*//* */
private static void addPageBreak(MainDocumentPart documentPart) { private static void addPageBreak(MainDocumentPart documentPart) {
Br breakObj = new Br(); Br breakObj = new Br();
breakObj.setType(STBrType.PAGE); breakObj.setType(STBrType.PAGE);
@ -673,4 +608,3 @@ public class HtmlToWord {
} }
} }
} }
*/

View File

@ -2256,7 +2256,6 @@ public class CoeProcessLevelUtil {
attribute.put("name", property.getPropertyName()); attribute.put("name", property.getPropertyName());
attribute.put("key", property.getPropertyId()); attribute.put("key", property.getPropertyId());
//如果是关联属性增加链接功能 //如果是关联属性增加链接功能
if(attributeModel.getType().equals("relation")){ if(attributeModel.getType().equals("relation")){
@ -2264,9 +2263,8 @@ public class CoeProcessLevelUtil {
String relationFileId = JSONObject.parseObject(property.getPropertyValue()).get("relationFileId").toString(); String relationFileId = JSONObject.parseObject(property.getPropertyValue()).get("relationFileId").toString();
String url=SDK.getPortalAPI().getPortalUrl()+"/r/w?uuid="+relationFileId+"&teamId=&cmd=com.actionsoft.apps.coe.pal_pl_repository_designer&sid="+sessionId+""; String url=SDK.getPortalAPI().getPortalUrl()+"/r/w?uuid="+relationFileId+"&teamId=&cmd=com.actionsoft.apps.coe.pal_pl_repository_designer&sid="+sessionId+"";
String appUrl="<a href='"+url+"' style='color:blue'>"+inputValue+"</a>"; String appUrl="<a href='"+url+"' style='color:blue' target='_blank'>"+inputValue+"</a>";
attribute.put("value", appUrl); attribute.put("value", appUrl);
}else{ }else{
attribute.put("value", inputValue); attribute.put("value", inputValue);