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. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  2. 个人博客开发之 ueditor 安装

  3. input type="file"文件上传时得到文件的本地路劲

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta name=& ...

  4. fedora上安装sun jdk

    系统被来就有openjdk,但是开发工具需要sun的jdk,于是下载一个压缩包并解压到一个位置.使用alternative命令切换 alternatives --.0_79/jre/bin/java ...

  5. myeclipse中文编码错误,没有GBK选项

    默认编码是UTF-8,但是导入GBK工程后,直接改为ISO-8859-1,但是还是编码错误. 用网上的: 全局编码设置:编码设置的方法:ToolBar-->Window-->Prefere ...

  6. head&amp;&amp;tail

    //參考<Linux shell脚本攻略 第2版> 1,head a)打印前10行: ubuntu@VM-62-13-ubuntu:~$ head file b)打印前5行: ubuntu ...

  7. Unity3D学习笔记——NGUI之UIScrollBar

    UIScrollBar:这个组件可以用于创建滚动条. 效果图如下: 一:使用步骤 1.这个组件和UISlider很像,也是由三部分组成. 2.首先创建一个Sprite用于组件的背景色. 3.创建第二个 ...

  8. 高通音频 媒体喇叭增益隐藏参数(一个QACT无法修改的参数)

    源文件位置:modem_proc\multimedia\audio\avs\src\sndhwg2.c sndhw_init()函数,2520行左右:pm_set_speaker_gain(PM_SP ...

  9. http://localhost:8080请求用户名和密码。信息为:“XDB” 解决办法

    windows查看端口占用情况 cmd下 netstat -ano 查看端口和对应的服务 为2520 Oracle的服务 源博客: http://blog.163.com/jxguo_05/blog/ ...

  10. SQL 基本关键字 函数 关联 连接

    http://www.w3cschool.cn/sql_having.html  w3c中有些SQL的讲解 1 order by 排序 SELECT Company, OrderNumber FROM ...