package com.sicdt.library.core.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Set; import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.converter.core.XWPFConverterException; public class WordUtils { /**
* <br>
* 描 述: doc内容改变 <br>
* 作 者: shizhenwei <br>
* 历 史: (版本) 作者 时间 注释
*
* @param is
* doc文档模板
* @param params
* key value 将模板里的可以替换为响应VALUE
* @return
* @throws IOException
*/
public static byte[] docContentChange(InputStream is, Map<String, String> params) throws IOException {
HWPFDocument document = new HWPFDocument(is);
Range range = document.getRange(); Set<String> keys = params.keySet();
for (String key : keys) {
range.replaceText(key, params.get(key));
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.write(baos);
byte[] bytes = baos.toByteArray(); document.close();
baos.close();
return bytes;
} /**
* <br>
* 描 述: docx内容改变 <br>
* 作 者: shizhenwei <br>
* 历 史: (版本) 作者 时间 注释
*
* @param is
* docx文档模板
* @param params
* key value 将模板里的可以替换为响应VALUE
* @return
* @throws IOException
* @throws XWPFConverterException
*/
public static byte[] docxContentChange(InputStream is, Map<String, String> params)
throws XWPFConverterException, IOException {
return DocxUtils.docxContentChange(is, params);
} /**
* <br>
* 描 述: 将docx字节数组流转换为pdf字节数组流 <br>
* 作 者: shizhenwei <br>
* 历 史: (版本) 作者 时间 注释
*
* @param docxBytes
* docx文档字节数组
* @return
* @throws XWPFConverterException
* @throws IOException
* 注:需在部署系统安装word对应的中文字体
*/
public static byte[] docx2pdf(byte[] docxBytes) throws XWPFConverterException, IOException {
return DocxUtils.docx2pdf(docxBytes);
} /**
* <br>
* 描 述: 将Word模板流改变内容后转换为pdf字节数组流 <br>
* 作 者: shizhenwei <br>
* 历 史: (版本) 作者 时间 注释
*
* @param is
* docx文档输入流
* @param params
* key value 将模板里的可以替换为响应VALUE
* @return
* @throws IOException
* @throws XWPFConverterException
* * 注:需在部署系统安装word对应的中文字体
*/
public static byte[] docx2pdf(InputStream is, Map<String, String> params)
throws XWPFConverterException, IOException {
return DocxUtils.docx2pdf(is, params);
}
}
package com.sicdt.library.core.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set; import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.converter.core.XWPFConverterException;
import org.apache.poi.xwpf.converter.pdf.PdfConverter;
import org.apache.poi.xwpf.converter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
/**
*
* @author zhenwei.shi
*
*/
public class DocxUtils { /**
* <br>
* 描 述: doc内容改变 <br>
* 作 者: shizhenwei <br>
* 历 史: (版本) 作者 时间 注释
*
* @param is
* doc文档模板
* @param params
* key value 将模板里的可以替换为响应VALUE
* @return
* @throws IOException
*/
public static byte[] docContentChange(InputStream is, Map<String, String> params) throws IOException {
HWPFDocument document = new HWPFDocument(is);
Range range = document.getRange(); Set<String> keys = params.keySet();
for (String key : keys) {
range.replaceText("{{"+key.toString()+"}}", params.get(key));
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.write(baos);
byte[] bytes = baos.toByteArray(); document.close();
baos.close();
return bytes;
} /**
* <br>描 述: docx内容改变
* <br>作 者: shizhenwei
* <br>历 史: (版本) 作者 时间 注释
* @param is docx文档模板
* @param params key value 将模板里的可以替换为响应VALUE
* @return
* @throws IOException
* @throws XWPFConverterException
*/
public static byte[] docxContentChange(InputStream is,Map<String,String> params) throws XWPFConverterException, IOException{
XWPFDocument document = new XWPFDocument(is);
List<XWPFParagraph> list = document.getParagraphs();
for(XWPFParagraph paragraph : list){
String regex = "(\\w|\\W)*\\{\\{\\w+\\}\\}(\\w|\\W)*";//{{string}}匹配
if(!paragraph.getText().matches(regex)){
continue;
}
List<XWPFRun> runs = paragraph.getRuns();
loop : for(int i=0; i<runs.size(); i++){
XWPFRun run = runs.get(i);
if(!run.text().matches(regex)){
continue;
}
if(null==params || params.keySet().size()<1){
run.setText("",0);
continue;
}
Set<String> keySet = params.keySet();
for(String key : keySet){
if(run.text().contains(key)){
String text = run.text().replaceAll(getReplaceAllKey("{{"+key.toString()+"}}"), params.get(key));
run.setText(text,0);
continue loop;
}
}
run.setText("",0);
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.write(baos);
byte[] bytes = baos.toByteArray();
document.close();
baos.close();
return bytes;
} /**
* <br>描 述: 将docx字节数组流转换为pdf字节数组流
* <br>作 者: shizhenwei
* <br>历 史: (版本) 作者 时间 注释
* @param docxBytes docx文档字节数组
* @return
* @throws XWPFConverterException
* @throws IOException
* 注:需在部署系统安装word对应的中文字体
*/
public static byte[] docx2pdf(byte[] docxBytes) throws XWPFConverterException, IOException{
PdfOptions options = PdfOptions.create();
XWPFDocument document = new XWPFDocument(new ByteArrayInputStream(docxBytes));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfConverter.getInstance().convert(document, baos, options);
return baos.toByteArray();
} /**
* <br>描 述: 将Word模板流改变内容后转换为pdf字节数组流
* <br>作 者: shizhenwei
* <br>历 史: (版本) 作者 时间 注释
* @param is docx文档输入流
* @param params key value 将模板里的可以替换为响应VALUE
* @return
* @throws IOException
* @throws XWPFConverterException
* * 注:需在部署系统安装word对应的中文字体
*/
public static byte[] docx2pdf(InputStream is,Map<String, String> params) throws XWPFConverterException, IOException{
XWPFDocument document = new XWPFDocument(is);
List<XWPFParagraph> list = document.getParagraphs();
for(XWPFParagraph paragraph : list){
String regex = "(\\w|\\W)*\\{\\{\\w+\\}\\}(\\w|\\W)*";//{{string}}匹配
if(!paragraph.getText().matches(regex)){
continue;
}
List<XWPFRun> runs = paragraph.getRuns();
for(int i=0; i<runs.size(); i++){
XWPFRun run = runs.get(i);
if(!run.text().matches(regex)){
continue;
}
Set<String> keySet = params.keySet();
for(String key : keySet){
key = "{{"+key+"}}";
if(run.text().contains(key)){
String text = run.text().replaceAll(getReplaceAllKey(key), params.get(key));
run.setText(text,0);
}
}
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfOptions options = PdfOptions.create();
PdfConverter.getInstance().convert(document, baos, options);
byte[] bytes = baos.toByteArray();
document.close();
baos.close();
return bytes;
} /**
*
* <br>描 述: String replaceAll方法默认正则 {{}} 对特殊字符进行转义,如 {} == \\{\\}
* <br>作 者: shizhenwei
* <br>历 史: (版本) 作者 时间 注释
* @param key
* @return
*/
public static String getReplaceAllKey(String key){
String afterKey = "";
for(int i=0; i<key.length(); i++){
if('{'==key.charAt(i)){
afterKey+="\\{";
}else if('}'==key.charAt(i)){
afterKey+="\\}";
}else{
afterKey+=key.charAt(i);
}
}
return afterKey;
}
}

java WordUtils word文档工具类的更多相关文章

  1. 使用Java生成word文档(附源码)

    当我们使用Java生成word文档时,通常首先会想到iText和POI,这是因为我们习惯了使用这两种方法操作Excel,自然而然的也想使用这种生成word文档.但是当我们需要动态生成word时,通常不 ...

  2. Java操作word文档使用JACOB和POI操作word,Excel,PPT需要的jar包

    可参考文档: http://wibiline.iteye.com/blog/1725492 下载jar包 http://download.csdn.net/download/javashixiaofe ...

  3. 使用Aspose.word (Java) 填充word文档数据(包含图片填充)

    Aspose填充word数据 本文介绍了如何使用aspose进行word文档的生成,并提供了工具类供参考. 有问题欢迎 call 微信:905369866,小弟尽力而为..毕竟这玩意没吃透. 目录 A ...

  4. Java解析word文档

    背景 在互联网教育行业,做内容相关的项目经常碰到的一个问题就是如何解析word文档. 因为系统如果无法智能的解析word,那么就只能通过其他方式手动录入word内容,效率低下,而且人工成本和录入出错率 ...

  5. Java 处理word文档后在前端展示

    最新新开发的这个项目需要使用word文档并要求能在前端页面上带格式展示,由于项目不是内部使用,所以不考虑插件类的处理模式,都必须要本地处理完成,前端不需要做什么更新或者说安装就能直接访问,类似于百度文 ...

  6. [转载]java获取word文档的条目化内容

    在开发Web办公系统或文档系统时,PageOffice组件是众所周知的在线处理微软word/ppt/excel文档的强大工具,它对WORD文档的各种处理在API层面进行了封装,屏蔽了Office VB ...

  7. Java 替换word文档文字,指定位置插入图片

    先说下 需要的依赖包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ex ...

  8. [原创]java获取word文档的条目化内容

    在开发Web办公系统或文档系统时,PageOffice组件是众所周知的在线处理微软word/ppt/excel文档的强大工具,它对WORD文档的各种处理在API层面进行了封装,屏蔽了Office VB ...

  9. java 处理word文档 (含图片,表格内容)

    因为本人长期从事Oa相关项目的开发,所以处理word文档,Pdf,Excel等是在所难免的. 1.需求      处理Excel 能够用jxl        或者poi 2需求     用户在系统上填 ...

随机推荐

  1. 基于AR9331(MIPS架构)分析系统启动过程(uboot)

    前提: 1.AR9331是基于MIPS 24K CPU的一款WIFI1X1芯片,其SDK采用uboot作为引导.AR9331中定义的基地址是:0x9f00,0000 2.MIPS24K芯片,将固定的起 ...

  2. php 使用curl 将文件上传

    <?php /**   *  curl文件上传   *  @var  struing  $r_file  上传文件的路劲和文件名     */ function upload_file($r_f ...

  3. LeetCode207. Course Schedule

    Description There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses m ...

  4. 你设计的应用是IO依赖型还是CPU依赖型?

    这个话题可能看起来非常枯燥,但它对mysql的性能优化非常重要. 其实我在MYSQL 咨询工作中无时无刻接不在接触这类问题. IO工作负载与cpu依赖全然不同,尤其是当你的工作集(通常仅仅有数据库的一 ...

  5. grails 解决emoji标签存入mysql

    domain将存储emoji属性类型设置位byte[] class UserTest { byte[] nameBytes //存储emoji表情字段 Date dateCreated //grail ...

  6. 【转】windows下python开发环境搭建

    1 -- 安装python的前期准备 Python开发有众多工具,又以Eclipse+Pydev最为常见.Eclipse平台对开发同学来讲,肯定是如雷贯耳,自不用废话.而PyDev是Eclipse平台 ...

  7. springmvc 环境配置图

  8. 第一百八十二节,jQuery-UI,知问前端--日历 UI

    jQuery-UI,知问前端--日历 UI 学习要点: 1.调用 datepicker()方法 2.修改 datepicker()样式 3.datepicker()方法的属性 4.datepicker ...

  9. jetty端口灵活配置方法

    在使用maven开发web项目极大地方便了jar包的依赖,在测试时也可以集成Servlet容器,从启动速度和量级上看,Jetty无疑是不二选择. 如果多个项目同时启动,就会端口冲突了. 一种办法是通过 ...

  10. Python中的图像处理

    第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像.图像转换和缩放.计算导数.画图和保存结果等的基本工具.这 ...