Word模板内容修改

1.java代码

package com.sicdt.sicsign.web.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set; import org.apache.commons.lang3.StringUtils;
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.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
/**
*
* @author zhenwei.shi
*
*/
public class DocxUtils {
//word模板的标签为【string】
private static final String FLAG_L = "【";//标签左侧
private static final String FLAG_R = "】";//标签右侧
//private static final String REGEX = "(\\w|\\W)*\\【\\w+\\】(\\w|\\W)*";//正则匹配*【*】*类型字符串
public static final String NULL_REPLACE = " / ";//如果没有替换的将显示" "
public static final String DOWNLOAD_REPLACE = " ";//下载替换word模板标签
public static final String PREVIEW_REPLACE = " / ";//预览替换word模板标签
/**
* <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 {
if(null==params){
params = new HashMap<String,String>();
}
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>描 述: 改变word内容,讲word标签【*】替换为指定内容
* <br>作 者: shizhenwei
* <br>历 史: (版本) 作者 时间 注释
* @return
* @throws IOException
* @throws XWPFConverterException
*/
public static byte[] docxContentChange(InputStream is,Map<String,String> params) throws XWPFConverterException, IOException{
return docxContentChange(is,params,NULL_REPLACE);
} /**
* <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,String replace) throws XWPFConverterException, IOException{
if(null==params){
params = new HashMap<String,String>();
}
XWPFDocument document = new XWPFDocument(is);
//替换段落内容
List<XWPFParagraph> list = document.getParagraphs();
for(XWPFParagraph paragraph : list){
replaceParagraph(paragraph, params, replace,true);
} //替换表格内容
List<XWPFTable> tableList = document.getTables();
for(XWPFTable table : tableList){
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
List<XWPFParagraph> paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
replaceParagraph(para, params, replace,false);
}
}
}
}
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,String replace) throws XWPFConverterException, IOException{
if(null==params){
params = new HashMap<String,String>();
}
XWPFDocument document = new XWPFDocument(is);
//替换段落内容
List<XWPFParagraph> list = document.getParagraphs();
for(XWPFParagraph paragraph : list){
replaceParagraph(paragraph, params, replace,true);
} //替换表格内容
List<XWPFTable> tableList = document.getTables();
for(XWPFTable table : tableList){
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
List<XWPFParagraph> paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
replaceParagraph(para, params, replace,false);
}
}
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfOptions options = PdfOptions.create();
PdfConverter.getInstance().convert(document, baos, options);
byte[] bytes = baos.toByteArray();
document.close();
baos.close();
return bytes;
} //在替换的值左右延长两个空格长度
public static String getReplaceValue(String old){
return " "+old+" ";
}
/**
* <br>描 述: 替换段落内容
* <br>作 者: shizhenwei
* <br>历 史: (版本) 作者 时间 注释
* @param paragraph
* @param params
* @param replace
* @param underline
* @return
*/
public static String replaceParagraph(XWPFParagraph paragraph,Map<String, String> params,String replace,boolean underline){
//字符串过长,调用matches方法报堆溢出错误
/*String regex = REGEX;//【string】匹配
if(!paragraph.getText().matches(regex)){
continue;
}*/
//改为contains
String pghTxt = paragraph.getText();
if(!(pghTxt.contains(FLAG_L)&&pghTxt.contains(FLAG_R))){
return null;
}
List<XWPFRun> runs = paragraph.getRuns();
String key = "";
boolean left = false;//left=true 说明有【
boolean right = false;//right=true 说明有】
//这里没有做到百分百细致化,如果run中出现这样的形式 *【*】*】或者*】*【*】,将会存在问题,所以要监管好模板。
for(int i=0; i<runs.size(); i++){
XWPFRun run = runs.get(i);
String runText = run.text();
if(runText.contains(FLAG_L) && runText.contains(FLAG_R)){
key = runText.substring(runText.indexOf(FLAG_L)+1,runText.indexOf(FLAG_R));
String text = runText.replaceAll(FLAG_L+key+FLAG_R, StringUtils.isEmpty(params.get(key))?replace:getReplaceValue(params.get(key)));
run.setText(text,0);
key = "";
addUnderline(run, underline);
}else if(runText.contains(FLAG_L)){
left = true;
String temp = runText.substring(runText.indexOf(FLAG_L)+1);
key += temp;
String text = runText.replaceAll(FLAG_L+temp, "");
run.setText(text,0);
addUnderline(run, underline);
}else if(runText.contains(FLAG_R)){
right = true;
String temp = runText.substring(0,runText.indexOf(FLAG_R));
key += temp;
String text = runText.replaceAll(temp+FLAG_R, (StringUtils.isEmpty(params.get(key))?replace:getReplaceValue(params.get(key))));
run.setText(text,0);
key = "";
left = false;
right = false;
addUnderline(run, underline);
}else{
if(left==true && right==false){
key += runText;
run.setText("",0);
addUnderline(run, underline);
}
if(left==false){
continue;
}
}
}
return StringUtils.isEmpty(params.get(key))?replace:getReplaceValue(params.get(key));
} /**
* <br>描 述: 添加下划线
* <br>作 者: shizhenwei
* <br>历 史: (版本) 作者 时间 注释
* @param run
* @param underline
* @return
*/
public static XWPFRun addUnderline(XWPFRun run,boolean underline){
//是否添加下划线
if(underline){
run.setUnderline(UnderlinePatterns.SINGLE);
}else{
run.setUnderline(UnderlinePatterns.NONE);
}
return run;
}
}
package com.sicdt.sicsign.web.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map; 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 {
return DocxUtils.docContentChange(is, params);
} /**
* <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内容预览 <br>
* 作 者: zhaowei <br>
* 历 史: (版本) 作者 时间 注释
*
* @param is
* @param params
* @return
* @throws XWPFConverterException
* @throws IOException
*/
public static byte[] docxContentChangeView(InputStream is, Map<String, String> params)
throws XWPFConverterException, IOException {
return DocxUtils.docxContentChange(is, params,DocxUtils.PREVIEW_REPLACE);
} /***
* <br>
* 描 述: docx内容预览 <br>
* 作 者: zhaowei <br>
* 历 史: (版本) 作者 时间 注释
*
* @param is
* @param params
* @return
* @throws XWPFConverterException
* @throws IOException
*/
public static byte[] docxContentChangeDownload(InputStream is, Map<String, String> params)
throws XWPFConverterException, IOException {
return DocxUtils.docxContentChange(is, params,DocxUtils.DOWNLOAD_REPLACE);
} /**
* <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,DocxUtils.NULL_REPLACE);
}
}

2.poi版本

<!-- 以下是POI相关使用     注:版本号不可轻易更改 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.17</version>
</dependency>

3.模板样式

  

  

Word内容修改,以及转PDF的更多相关文章

  1. 将Word转为带书签的PDF

    将word文档存为PDF可以带来很多便利,在这里就不多说了.下面讨论一下转换方法. 我现在使用的是Word2010+Acrobat9,所以这里仅讨论使用这种组合的转换方法. 在Word2010中有两种 ...

  2. C#中锁定Word内容,样把人家的锁定内容破解了

    原文地址:http://www.cnblogs.com/name-lh/archive/2007/04/29/732620.html     教您怎样在C#中锁定Word内容,还教您怎样把人家的锁定内 ...

  3. C# 添加、修改和删除PDF书签

    C# 添加.修改和删除PDF书签 有时候我们在阅读PDF文档时会遇到这样一种情况:PDF文档页数比较多,但是又没有书签,所以我们不能根据书签快速了解文档所讲解的内容,也不能点击书签快速跳转到相应的位置 ...

  4. java 如何将 word,excel,ppt如何转pdf --openoffice (1)

    承上启下,可折叠 上一篇说的是:服务器是windows server时,用jacob将msoffice(指的是word,excel,ppt)转换成pdf. 若被部署项目的服务器是centOS等linu ...

  5. 在一段字符串中的指定位置插入html标签,实现内容修改留痕

    客户需求:实现内容修改留痕,并且鼠标移动到元素时,显示修改人和修改时间. (其实呢本人觉得这个如果是静态的页面,或者是后端拼接好的html,都很好实现,如果让前端动态实现就......) 前端实现的方 ...

  6. .net npoi读word内容+目录

    最近在做读npoi文档存入搜索引擎,实现快速查询word文档中内容并展示,效果希望带有目录导航. 网上有很多例子都是读写操作,很肤浅没有具体读到想要的东西所以自己就写了个demo,也有微软提供的off ...

  7. Python将word文档批量转PDF

    前面有一篇<Python批量创建word文档(2)- 加图片和表格>的文章,利用这篇文章创建的word文档来批量转PDF文档.代码: 1 ''' 2 #python批量将word文档转换成 ...

  8. java读取word内容

    暂时只写读取word内容的方法. 依赖的jar: poi-3.9-20121203.jarpoi-ooxml-3.9-20121203.jarxmlbeans-2.3.0.jar package co ...

  9. JQuery DataTables Editor---页面内容修改&&数据库信息修改 (2)

    接上篇博文,详细说一下js代码以及JQuery DataTables Editor---页面内容修改&&数据库信息修改遇到的问题和解决办法. 1.关于dialog 初始化: $(&qu ...

随机推荐

  1. UTF-8和GBK的区别

    GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准).GBK编码专门用来解决中文编码的,是双字节的.不论中英文都是双字节的. UTF-8编码是用以解决国际上字符的一种 ...

  2. 基于springCloud的分布式架构体系

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  3. PHP运算符===和==的区别

    区别: ===是恒等计算符   同时检查表达式的值与类型 ==是比较运算符号  不会检查条件式的表达式的类型 转自:  http://jingyan.baidu.com/article/03b2f78 ...

  4. 微信小程序 快键键

    快捷键 格式调整 - Ctrl+S:保存文件 - Ctrl+[, Ctrl+]:代码行缩进 - Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块 - Ctrl+C Ctrl+V:复 ...

  5. Unity3D学习笔记——NGUI之UIPopupList

    UIPopupList:将这个组件添加到Button上,即可构建一个下拉列表. 效果图如下: 一:使用步骤 1.首先创建一个Sprite作为button. 2.创建一个label,用于显示当前选择的选 ...

  6. iOS QQ的AppID转换16进制的方法

    801312852为QQ的AppID 打开终端 echo 'ibase=10;obase=16;801312852'|bc   红色框内的即为转换后的16进制

  7. http 状态吗

    100:继续  客户端应当继续发送请求.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应. 101: 转换协议  在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消 ...

  8. ios代码实现时间设置NSDate

    本文转载至 http://www.baidu.com/link?url=dcQWiL1FD_She6P4RM2IvEeJas0_gtG3LkRNTV5H87X0AyKCHvwYjBz2hdcB2JVp ...

  9. 41、Android中当数据库需要更新时我们该怎么办?

    转载  http://blog.csdn.net/jiangwei0910410003/article/details/39670813

  10. Win7系统安装 MySQL 8.0.11

    1. 下载 MySQL 8.0.11 版本 下载地址: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 2. 下载 ...