700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java freemarker 导出富文本到Word文档

java freemarker 导出富文本到Word文档

时间:2023-11-09 17:24:42

相关推荐

java freemarker 导出富文本到Word文档

最近一直在加班 导致看到代码就想吐 今天抽出时间来记录一下 用freemaker导出富文本信息

之前使用freemaker导出图片等信息时 使用的是xml方式,不明白的 可以看freemaker生成Word文档(图片、超链接)

由于xml方式 不识别<p><b>等这种HTML标签,所以只能使用mht方式来解决,话不多说 干起来!

我是看到前辈的文章才 有所启发!

1.准备好模板

这里我要强调一下 模板里面插入图片时 不要使用插入->上传图片,这样会是超链接的形式,里面使用的绝对路径 当把文档转给他人时 图片显示不出来

这种上传图片方式是错误的 应该直接复制图片到Word文档中

此时,模板已生成

将模板内容替换为占位符(${})形式 此时建议保留图片 这样分析文档结构 方便些

后另存为 单个文件网页(*.mht,*.mhtml)文件,于是生成一个.mht文件 最后调整后缀名为ftl文件

2.ftl占位符修改

全文检索gb2312/utf-8把他改成utf-8,同时需要加上3D前缀${}占位符 中间会生成一些其他字符 需要将其他扰乱信息去掉 只保留占位符记住这三处标识【NextPart_ 和 Content-Location】 这里文档 全都是一样的 所以在生成图片base64定义时 也要保持一致

添加 ${imagesBase64String!""} 标识 在folHlink下面添加 该标识 存放图片base64信息

添加 ${imagesXmlHrefString!""} 标识 在filelist.xml 上面添加 该标识 存放图片base64的链接信息去掉之前 保留的图片信息对应代码

其实添加的${imagesBase64String}和${imagesXmlHrefString}标识 就是 首先定义一个图片的base64,然后在下面引用,随后在正文中 直接调用图片的引用即可。

不明白的 可以看一下 其他图片的生成方式 【上面建议保留一张图片, 就是为了方便文档结构中图片的分析】

例如:看一下图片 image004.jpg

图片base64的定义图片链接的引用图片的显示 调用图片链接的引用 <v:shape>xxxxx</v:shape>及后面的<img/> 这些是页面显示的图片 需要动态生成

此时 报告的模板修改 已经完成,下面开始上代码

因为 本项目的富文本存储的形式 为base64,而不是存储图片的地址,所以需要先根据base64生成图片 在进行操作。

测试数据

Map<String, Object> dataMap = new HashMap<>();List<String> photoNameList=new ArrayList<>();String handledBase64Block = ""; //base64String xmlimaHref = ""; //图片链接//模拟数据StringBuilder sb = new StringBuilder();sb.append("<div>");sb.append("<p>概况</p><p><br></p><p><img src=\"data:image/png;base64,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\"></p><p><br></p><p><span style=\"color: rgb(230, 0, 0);\" class=\"ql-size-large\">去掉ip校验</span></p>");sb.append("<p><span style=\"color: rgb(77, 77, 77);\">利用</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">来解析带</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">图片的富文本,思路是:</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板另存为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">mht</code><span style=\"color: rgb(77, 77, 77);\">格式,再修改后缀为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">ftl</code><span style=\"color: rgb(77, 77, 77);\">。将</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">字符串的图片,填充到制作的模板上。</span></p><p><span style=\"color: rgb(77, 77, 77);\">首先我们需要填充的</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板如下:</span></p>");sb.append("</div>");RichHtmlHandler test1handler = new RichHtmlHandler(sb.toString());test1handler.setDocSrcLocationPrex("file:///C:/5181FBD1");test1handler.setDocSrcParent("file3105.files");test1handler.setNextPartId("01D73090.2D92D3A0");test1handler.setShapeidPrex("_x56fe__x7247__x0020");test1handler.setSpidPrex("_x0000_i");test1handler.setTypeid("#_x0000_t75");try {test1handler.handledHtml(false,filePath);} catch (IOException e) {e.printStackTrace();}if (test1handler.getDocBase64BlockResults() != null&& test1handler.getDocBase64BlockResults().size() > 0) {for (String item : test1handler.getDocBase64BlockResults()) {handledBase64Block += item + "\n";}}if (test1handler.getXmlImgRefs() != null&& test1handler.getXmlImgRefs().size() > 0) {for (String item : test1handler.getXmlImgRefs()) {xmlimaHref += item + "\n";}}String bodyBlock = test1handler.getHandledDocBodyBlock();dataMap.put("test1",bodyBlock);StringBuilder sbTest2 = new StringBuilder();sbTest2.append("<div>");sbTest2.append("<img src=\"data:image/jpeg;base64,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\">");sbTest2.append("<p><span style=\"color: rgb(77, 77, 77);\">利用</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">来解析带</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">图片的富文本,思路是:</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板另存为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">mht</code><span style=\"color: rgb(77, 77, 77);\">格式,再修改后缀为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">ftl</code><span style=\"color: rgb(77, 77, 77);\">。将</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">字符串的图片,填充到制作的模板上。</span></p><p><span style=\"color: rgb(77, 77, 77);\">首先我们需要填充的</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板如下:</span></p>");sbTest2.append("<span>中国梦,幸福梦!</span>");sbTest2.append("</div>");RichHtmlHandler test2handler = new RichHtmlHandler(sbTest2.toString());test2handler.setDocSrcLocationPrex("file:///C:/5181FBD1");test2handler.setDocSrcParent("file3105.files");test2handler.setNextPartId("01D73090.2D92D3A0");test2handler.setShapeidPrex("_x56fe__x7247__x0020");test2handler.setSpidPrex("_x0000_i");test2handler.setTypeid("#_x0000_t75");try {test2handler.handledHtml(false,filePath);} catch (IOException e) {e.printStackTrace();}String eventCoursehandlerBodyBlock = test2handler.getHandledDocBodyBlock();dataMap.put("test2",eventCoursehandlerBodyBlock);if (test2handler.getDocBase64BlockResults() != null&& test2handler.getDocBase64BlockResults().size() > 0) {for (String item : test2handler.getDocBase64BlockResults()) {handledBase64Block += item + "\n";}}if (test2handler.getXmlImgRefs() != null&& test2handler.getXmlImgRefs().size() > 0) {for (String item : test2handler.getXmlImgRefs()) {xmlimaHref += item + "\n";} }dataMap.put("imagesBase64String", handledBase64Block);dataMap.put("imagesXmlHrefString", xmlimaHref);

HTML解析

public class RichHtmlHandler {private Document doc = null;private String html;private String docSrcParent = "";private String docSrcLocationPrex = "";private String nextPartId;private String shapeidPrex;private String spidPrex;private String typeid;private String handledDocBodyBlock;private List<String> docBase64BlockResults = new ArrayList<String>();private List<String> xmlImgRefs = new ArrayList<String>();private List<String> photoNameList=new ArrayList<>(); //存储临时图片 方便后续删除public List<String> getPhotoNameList() {return photoNameList;}public String getDocSrcLocationPrex() {return docSrcLocationPrex;}public void setDocSrcLocationPrex(String docSrcLocationPrex) {this.docSrcLocationPrex = docSrcLocationPrex;}public String getNextPartId() {return nextPartId;}public void setNextPartId(String nextPartId) {this.nextPartId = nextPartId;}public String getHandledDocBodyBlock() {String raw= WordHtmlGeneratorHelper.string2Ascii(doc.getElementsByTag("body").html());return raw.replace("=3D", "=").replace("=", "=3D");}public String getRawHandledDocBodyBlock() {String raw= doc.getElementsByTag("body").html();return raw.replace("=3D", "=").replace("=", "=3D");}public List<String> getDocBase64BlockResults() {return docBase64BlockResults;}public List<String> getXmlImgRefs() {return xmlImgRefs;}public String getShapeidPrex() {return shapeidPrex;}public void setShapeidPrex(String shapeidPrex) {this.shapeidPrex = shapeidPrex;}public String getSpidPrex() {return spidPrex;}public void setSpidPrex(String spidPrex) {this.spidPrex = spidPrex;}public String getTypeid() {return typeid;}public void setTypeid(String typeid) {this.typeid = typeid;}public String getDocSrcParent() {return docSrcParent;}public void setDocSrcParent(String docSrcParent) {this.docSrcParent = docSrcParent;}public String getHtml() {return html;}public void setHtml(String html) {this.html = html;}public RichHtmlHandler(String html) {doc = Jsoup.parse(wrappHtml(html));}public void re_init(String html){doc=null;doc = Jsoup.parse(wrappHtml(html));docBase64BlockResults.clear();xmlImgRefs.clear();}/*** @Description: 获得已经处理过的HTML文件* @param @return* @return String* @throws IOException * @throws*/public void handledHtml(boolean isWebApplication,String filePath)throws IOException {List<String> photoNames=new ArrayList<>();Elements imags = doc.getElementsByTag("img");if (imags == null || imags.size() == 0) {// 返回编码后字符串return;}for (Element item : imags) {// 把文件取出来String src = item.attr("src");File imageFile = null;String fileTypeName="jpg";String uuid = UUIDUtils.get32UUID(); //图片的UUIDString base64Content="";String srcRealPath = "";if(src.contains("base64")){//src="D:\\1.png";//将base64转换为图片file 存储到本地路径String[] split = src.split("base64,");if (split != null && split.length == 2) {if(split[0].contains("/")){fileTypeName=split[0].substring(split[0].indexOf("/")+1,split[0].length()-1);}base64Content= split[1];String photoName=uuid+"."+fileTypeName;Base64ToFileUtil.base64ToFile(filePath,base64Content,photoName);imageFile=new File(filePath+photoName);if(imageFile.exists()){photoNames.add(photoName);srcRealPath=filePath+photoName;item.attr("src",srcRealPath);}}}String imageFielShortName = imageFile.getName();String docFileName = "image" + uuid + "."+ fileTypeName;String srcLocationShortName = docSrcParent + "/" + docFileName;String styleAttr = item.attr("style"); // 样式int imageHeight = 0;int imageWidth = 0;// 得到文件的word mht的body块String handledDocBodyBlock = WordImageConvertor.toDocBodyBlock(srcRealPath,imageFielShortName, imageHeight, imageWidth,styleAttr,srcLocationShortName, shapeidPrex, spidPrex, typeid);item.parent().append(handledDocBodyBlock);item.remove();// 去替换原生的html中的imagString contextLoacation = docSrcLocationPrex + "/" + docSrcParent+ "/" + docFileName;String docBase64BlockResult = WordImageConvertor.generateImageBase64Block(nextPartId, contextLoacation,fileTypeName, base64Content);docBase64BlockResults.add(docBase64BlockResult);String imagXMLHref = "<o:File HRef=3D\"" + docFileName + "\"/>";xmlImgRefs.add(imagXMLHref);}photoNameList=photoNames;}private String getStyleAttrValue(String style, String attributeKey) {if (StringUtils.isEmpty(style)) {return "";}// 以";"分割String[] styleAttrValues = style.split(";");for (String item : styleAttrValues) {// 在以 ":"分割String[] keyValuePairs = item.split(":");if (attributeKey.equals(keyValuePairs[0])) {return keyValuePairs[1];}}return "";}private String wrappHtml(String html){// 因为传递过来都是不完整的docStringBuilder sb = new StringBuilder();sb.append("<html>");sb.append("<body>");sb.append(html);sb.append("</body>");sb.append("</html>");return sb.toString();}}

Word导出

public class WordGeneratorWithFreemarker { private static Configuration configuration = null; private static final String FTL_FP = "/template/"; //模板路径static { configuration = new Configuration(Configuration.VERSION_2_3_23); configuration.setDefaultEncoding("utf-8"); configuration.setClassicCompatible(true);configuration.setClassForTemplateLoading(WordGeneratorWithFreemarker.class, FTL_FP);} private WordGeneratorWithFreemarker() { } public static void createDoc(Map<String, Object> dataMap, String templateName, OutputStream out) throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException {Template t = configuration.getTemplate(templateName);WordHtmlGeneratorHelper.handleAllObject(dataMap);Writer w=null;try { // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开 w = new OutputStreamWriter(out);t.process(dataMap, w);} catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); }finally {if(w!=null){w.close();}}return ; }}

网页导出

public class WordHtmlGeneratorHelper {/** * @Description: 将字符换成3Dus-asci,十进制Accsii码* @param @param source* @param @return * @return String * @throws*/public static String string2Ascii(String source){if(source==null || source==""){return null;}StringBuilder sb=new StringBuilder();char[] c=source.toCharArray();for(char item : c){String itemascii="";if(item>=19968 && item<40623){itemascii=itemascii="&#"+(item & 0xffff)+";";}else{itemascii=item+"";}sb.append(itemascii);}return sb.toString();}/** * @Description: 将object的所有属性值转成成3Dus-asci编码值* @param @param object* @param @return * @return T * @throws*/public static <T extends Object> T handleObject2Ascii(final T toHandleObject){class myFieldsCallBack implements FieldCallback{@Overridepublic void doWith(Field f) throws IllegalArgumentException,IllegalAccessException {if(f.getType().equals(String.class)){//如果是字符串类型f.setAccessible(true);String oldValue=(String)f.get(toHandleObject);if(!StringUtils.isEmpty(oldValue)){f.set(toHandleObject, string2Ascii(oldValue));}//f.setAccessible(false);}}}ReflectionUtils.doWithFields(toHandleObject.getClass(), new myFieldsCallBack());return toHandleObject;}public static <T extends Object> List<T> handleObjectList2Ascii(final List<T> toHandleObjects){for (T t : toHandleObjects) {handleObject2Ascii(t);}return toHandleObjects;}public static void handleAllObject(Map<String, Object> dataMap){//去处理数据for (Map.Entry<String, Object> entry : dataMap.entrySet()){Object item=entry.getValue();//判断object是否是primitive type if(isPrimitiveType(item.getClass())){if(item.getClass().equals(String.class)){item=WordHtmlGeneratorHelper.string2Ascii((String)item);entry.setValue(item);}}else if(isCollection(item.getClass())){for (Object itemobject : (Collection)item) {WordHtmlGeneratorHelper.handleObject2Ascii(itemobject);}}else{WordHtmlGeneratorHelper.handleObject2Ascii(item);}}}public static String joinList(List<String> list,String join ){StringBuilder sb=new StringBuilder();for (String t : list) {sb.append(t);if(!StringUtils.isEmpty(join)){sb.append(join);}}return sb.toString();} private static boolean isPrimitiveType(Class<?> clazz){return clazz.isEnum() ||CharSequence.class.isAssignableFrom(clazz) ||Number.class.isAssignableFrom(clazz) ||Date.class.isAssignableFrom(clazz);}private static boolean isCollection(Class<?> clazz){return Collection.class.isAssignableFrom(clazz);}}

图片转换

public class WordImageConvertor {/*** @param @param imageSrc 文件路径* @param @return* @return String* @throws IOException* @throws* @Description: 将图片转换成base64编码的字符串* @author:LiaoFei* @date:-3-28 上午11:22:26*/public static String imageToBase64(String imageSrc) throws IOException {//判断文件是否存在File file = new File(imageSrc);if (!file.exists()) {throw new FileNotFoundException("文件不存在!");}StringBuilder pictureBuffer = new StringBuilder();FileInputStream input = new FileInputStream(file);ByteArrayOutputStream out = new ByteArrayOutputStream();//读取文件Base64 base64 = new Base64();BASE64Encoder encoder = new BASE64Encoder();byte[] temp = new byte[1024];for (int len = input.read(temp); len != -1; len = input.read(temp)) {out.write(temp, 0, len);}pictureBuffer.append(new String(base64.encodeBase64Chunked(out.toByteArray())));out.close();input.close();return pictureBuffer.toString();}public static String toDocBodyBlock(String imageFilePath,String imageFielShortName,int imageHeight,int imageWidth,String imageStyle,String srcLocationShortName,String shapeidPrex, String spidPrex, String typeid) {//shapeid//mht文件中针对shapeid的生成好像规律,其内置的生成函数没法得知,但是只要保证其唯一就行//这里用前置加32位的uuid来保证其唯一性。String shapeid = shapeidPrex;shapeid += UUIDUtils.get32UUID();//spid ,同shapeid处理String spid = spidPrex;spid += UUIDUtils.get32UUID();/*<!--[if gte vml 1]><v:shape id=3D"_x56fe__x7247__x0020_0" o:spid=3D"_x0000_i10=26"type=3D"#_x0000_t75" alt=3D"725017921264249223.jpg" style=3D'width:456.7=5pt;height:340.5pt;visibility:visible;mso-wrap-style:square'><v:imagedata src=3D"file9462.files/image001.jpg" o:title=3D"725017921264=249223"/></v:shape><![endif]--><![if !vml]><img width=3D609 height=3D454src=3D"file9462.files/image002.jpg" alt=3D725017921264249223.jpg v:shapes==3D"_x56fe__x7247__x0020_0"><![endif]>*/StringBuilder sb1 = new StringBuilder();sb1.append(" <!--[if gte vml 1]>");sb1.append("<v:shape id=3D\"" + shapeid + "\"");sb1.append("\n");sb1.append(" o:spid=3D\"" + spid + "\"");sb1.append(" type=3D\"" + typeid + "\" alt=3D\"" + imageFielShortName + "\"");sb1.append("\n");sb1.append(" style=3D' " + generateImageBodyBlockStyleAttr(imageFilePath, imageHeight, imageWidth) + imageStyle + "'");sb1.append(">");sb1.append("\n");sb1.append(" <v:imagedata src=3D\"" + srcLocationShortName + "\"");sb1.append("\n");sb1.append(" o:title=3D\"" + imageFielShortName.split("\\.")[0] + "\"");sb1.append("/>");sb1.append("</v:shape>");sb1.append("<![endif]-->");//以下是为了兼容游览器显示时的效果,但是如果是纯word阅读的话没必要这么做。StringBuilder sb2 = new StringBuilder();sb2.append(" <![if !vml]>");sb2.append("<img width=3D" + imageWidth + " height=3D" + imageHeight +" src=3D\"" + srcLocationShortName + "\" alt=" + imageFielShortName +" v:shapes=3D\"" + shapeid + "\">");sb2.append("<![endif]>");return sb1.toString() + sb2.toString();//return sb1.toString();}/*** @param @param nextPartId* @param @param contextLoacation* @param @param ContentType* @param @param base64Content* @param @return* @return String* @throws* @Description: 生成图片的base4块* @author:LiaoFei* @date:-3-28 下午4:02:05*/public static String generateImageBase64Block(String nextPartId, String contextLoacation,String fileTypeName, String base64Content) {/*--=_NextPart_01D188DB.E436D870Content-Location: file:///C:/70ED9946/file9462.files/image001.jpgContent-Transfer-Encoding: base64Content-Type: image/jpegbase64Content*/StringBuilder sb = new StringBuilder();sb.append("\n");sb.append("\n");sb.append("------=_NextPart_" + nextPartId);sb.append("\n");sb.append("Content-Location: " + contextLoacation);sb.append("\n");sb.append("Content-Transfer-Encoding: base64");sb.append("\n");sb.append("Content-Type: " + getImageContentType(fileTypeName));sb.append("\n");sb.append("\n");sb.append(base64Content);return sb.toString();}private static String generateImageBodyBlockStyleAttr(String imageFilePath, int height, int width) {StringBuilder sb = new StringBuilder();BufferedImage sourceImg;FileInputStream fileInputStream=null;try {fileInputStream = new FileInputStream(imageFilePath);sourceImg = ImageIO.read(fileInputStream);if (height == 0) {height = sourceImg.getHeight();}if (width == 0) {width = sourceImg.getWidth();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(fileInputStream!=null){try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}System.out.println("图片高度"+height+"图片宽度"+width);if(height>300){height=300;} if(width>500){width=500;}//将像素转化成ptBigDecimal heightValue = new BigDecimal(height * 12 / 16);heightValue = heightValue.setScale(2, BigDecimal.ROUND_HALF_UP);BigDecimal widthValue = new BigDecimal(width * 12 / 16);widthValue = widthValue.setScale(2, BigDecimal.ROUND_HALF_UP);sb.append("height:" + heightValue + "pt;");sb.append("width:" + widthValue + "pt;");sb.append("visibility:visible;");sb.append("mso-wrap-style:square; ");return sb.toString();}private static String getImageContentType(String fileTypeName) {String result = "image/jpeg";///table/http_content_typeif (fileTypeName.equals("tif") || fileTypeName.equals("tiff")) {result = "image/tiff";} else if (fileTypeName.equals("fax")) {result = "image/fax";} else if (fileTypeName.equals("gif")) {result = "image/gif";} else if (fileTypeName.equals("ico")) {result = "image/x-icon";} else if (fileTypeName.equals("jfif") || fileTypeName.equals("jpe")|| fileTypeName.equals("jpeg") || fileTypeName.equals("jpg")) {result = "image/jpeg";} else if (fileTypeName.equals("net")) {result = "image/pnetvue";} else if (fileTypeName.equals("png") || fileTypeName.equals("bmp")) {result = "image/png";} else if (fileTypeName.equals("rp")) {result = "image/vnd.rn-realpix";} else if (fileTypeName.equals("rp")) {result = "image/vnd.rn-realpix";}return result;}}

删除单个文件

public class FolderUtil {//删除单个文件public static boolean deleteFile(String fileName) {File file = new File(fileName);// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除if (file.exists() && file.isFile()) {if (file.delete()) {System.out.println("删除单个文件" + fileName + "成功!");return true;} else {System.out.println("删除单个文件" + fileName + "失败!");return false;}} else {System.out.println("删除单个文件失败:" + fileName + "不存在!");return false;}}}

测试

@GetMapping("/createReport")public void createReport() throws Exception{Map<String, Object> dataMap = new HashMap<>();List<String> photoNameList=new ArrayList<>();String handledBase64Block = ""; //base64String xmlimaHref = ""; //图片链接//模拟数据StringBuilder sb = new StringBuilder();sb.append("<div>");sb.append("<p>概况</p><p><br></p><p><img src=\"data:image/png;base64,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\"></p><p><br></p><p><span style=\"color: rgb(230, 0, 0);\" class=\"ql-size-large\">去掉ip校验</span></p>");sb.append("<p><span style=\"color: rgb(77, 77, 77);\">利用</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">来解析带</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">图片的富文本,思路是:</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板另存为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">mht</code><span style=\"color: rgb(77, 77, 77);\">格式,再修改后缀为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">ftl</code><span style=\"color: rgb(77, 77, 77);\">。将</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">字符串的图片,填充到制作的模板上。</span></p><p><span style=\"color: rgb(77, 77, 77);\">首先我们需要填充的</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板如下:</span></p>");sb.append("</div>");RichHtmlHandler test1handler = new RichHtmlHandler(sb.toString());test1handler.setDocSrcLocationPrex("file:///C:/AA89CAB4");test1handler.setDocSrcParent("testReport.files");test1handler.setNextPartId("01D7311D.703BAA50");test1handler.setShapeidPrex("_x56fe__x7247__x0020");test1handler.setSpidPrex("_x0000_i");test1handler.setTypeid("#_x0000_t75");try {test1handler.handledHtml(false,filePath);} catch (IOException e) {e.printStackTrace();}if (test1handler.getDocBase64BlockResults() != null&& test1handler.getDocBase64BlockResults().size() > 0) {for (String item : test1handler.getDocBase64BlockResults()) {handledBase64Block += item + "\n";}}if (test1handler.getXmlImgRefs() != null&& test1handler.getXmlImgRefs().size() > 0) {for (String item : test1handler.getXmlImgRefs()) {xmlimaHref += item + "\n";}}String bodyBlock = test1handler.getHandledDocBodyBlock();dataMap.put("test1",bodyBlock);StringBuilder sbTest2 = new StringBuilder();sbTest2.append("<div>");sbTest2.append("<img src=\"data:image/jpeg;base64,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\">");sbTest2.append("<p><span style=\"color: rgb(77, 77, 77);\">利用</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">来解析带</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">图片的富文本,思路是:</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板另存为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">mht</code><span style=\"color: rgb(77, 77, 77);\">格式,再修改后缀为</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">ftl</code><span style=\"color: rgb(77, 77, 77);\">。将</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">base64</code><span style=\"color: rgb(77, 77, 77);\">字符串的图片,填充到制作的模板上。</span></p><p><span style=\"color: rgb(77, 77, 77);\">首先我们需要填充的</span><code style=\"color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);\">word</code><span style=\"color: rgb(77, 77, 77);\">模板如下:</span></p>");sbTest2.append("</div>");RichHtmlHandler test2handler = new RichHtmlHandler(sbTest2.toString());test2handler.setDocSrcLocationPrex("file:///C:/AA89CAB4");test2handler.setDocSrcParent("testReport.files");test2handler.setNextPartId("01D7311D.703BAA50");test2handler.setShapeidPrex("_x56fe__x7247__x0020");test2handler.setSpidPrex("_x0000_i");test2handler.setTypeid("#_x0000_t75");try {test2handler.handledHtml(false,filePath);} catch (IOException e) {e.printStackTrace();}String eventCoursehandlerBodyBlock = test2handler.getHandledDocBodyBlock();dataMap.put("test2",eventCoursehandlerBodyBlock);if (test2handler.getDocBase64BlockResults() != null&& test2handler.getDocBase64BlockResults().size() > 0) {for (String item : test2handler.getDocBase64BlockResults()) {handledBase64Block += item + "\n";}}if (test2handler.getXmlImgRefs() != null&& test2handler.getXmlImgRefs().size() > 0) {for (String item : test2handler.getXmlImgRefs()) {xmlimaHref += item + "\n";}}dataMap.put("time", "-04-14");dataMap.put("imagesBase64String", handledBase64Block);dataMap.put("imagesXmlHrefString", xmlimaHref);photoNameList.addAll(test1handler.getPhotoNameList());photoNameList.addAll(test2handler.getPhotoNameList());String docFilePath = "d:\\createReport.doc";System.out.println(docFilePath);File f = new File(docFilePath);OutputStream out=null;try {out = new FileOutputStream(f);WordGeneratorWithFreemarker.createDoc(dataMap, "testReport.ftl", out);java.lang.System.out.println("图片"+photoNameList);if(photoNameList!=null&&photoNameList.size()>0){for(String photoName:photoNameList){if(photoName!=null&&!"".equals(photoName)){FolderUtil.deleteFile(filePath + photoName);}}}} catch (FileNotFoundException e) {} catch (MalformedTemplateNameException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}}

测试结果 (方便截图 部分数据删除)

【注意】

若是多个富文本 那么需要将imagesBase64String及imagesXmlHrefString 数据进行 累加

如图 上面测试代码 已经是 对这两个信息 进行累加的【对每一个富文本都进行累加 并且最后将imagesBase64String及imagesXmlHrefString 赋值给dataMap】

不足之处,还请多多指教!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。