一、前言
在项目中有需要对word进行操作的,可以看看哈,本次使用比较强大的spire组件来对word进行操作,免费版支持三页哦,对于不止三页的word文件,可以购买收费版,官网:https://www.e-iceblue.cn/tutorials.html#,也可使用其他组件实现,如poi、docx4j等,我将代码整理成工具类了,大家可以拿下来直接使用哈,一起努力吧。
二、Spire的使用
1、引入pom.xml
- <dependency>
- <groupId>e-iceblue</groupId>
- <artifactId>spire.office.free</artifactId>
- <version>5.3.1</version>
- </dependency>
复制代码 2、AddStampUtils
工具类- /**
- * @Author:wk
- * @Slogan:无论风雨,和自己一决胜负吧
- * @Create:2022/7/15/9:30
- * @Description:TODO Word文件操作工具类
- * @Version:1.0
- */
- @Slf4j
- public class AddStampUtils {
- // 转换目标文件地址
- // public static String WORD_OLD_URL = "src/main/resources/word/20200429宋体服务器同步版.doc";
- // 转换后文件存放地址
- // public static String WORD_NEW_URL = "src/main/resources/word/20200429宋体服务器同步版2.doc";
- // WORD转PDF存放位置
- // public static String PDF_NEW_URL = "src/main/resources/pdf/20200429宋体服务器同步版2.pdf";
- // 电子印章图片地址
- // public static String STAMP_IMG_URL = "src/main/resources/word/stamp.png";
- /**
- * 1、自定义位置添加电子印章
- * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作
- * @param wordOldUrl word文件路径
- * @param wordNewUrl 新word文件路径
- * @param stampImgUrl 电子印章图片路径
- * @param horizontal 电子印章水平位置 (当前文件推荐260f)
- * @param vertical 电子印章垂直位置 (当前推荐455f)
- * @param stampWidth 电子印章宽度(推荐120)
- * @param stampHeight 电子印章高度(推荐120)
- * @param bookmarkName 书签名,通过名称寻找书签文本所在位置
- * @param newBookmarkText 替换的文本新内容
- */
- public void addStamp(
- String wordOldUrl,String wordNewUrl,String stampImgUrl,
- Float horizontal,Float vertical,Float stampWidth,
- Float stampHeight,String bookmarkName,String newBookmarkText
- ) {
- // 加载文档
- Document document = new Document();
- document.loadFromFile(wordOldUrl);
- // 获取指定段落
- Section section = document.getSections().get(0);
- // 获取段落总数
- int count = section.getParagraphs().getCount();
- log.info("获取文档内容段落总数{}",count);
- Paragraph paragraph = section.getParagraphs().get(0);
- // 判断是否需要替换书签位置文本内容
- if (StringUtils.isNotEmpty(bookmarkName)) {
- replaceBookmarkContent(document,bookmarkName,newBookmarkText);
- }
- // 添加电子印章
- DocPicture docPicture = paragraph.appendPicture(stampImgUrl);
- // 指定电子章位置
- // 水平位置
- docPicture.setHorizontalPosition(horizontal);
- // 垂直位置
- docPicture.setVerticalPosition(vertical);
- // 设置电子章大小
- docPicture.setWidth(stampWidth);
- docPicture.setHeight(stampHeight);
- // 设置图片位于文字顶层
- docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);
- // 保存添加电子章的Word文档
- document.saveToFile(wordNewUrl);
- document.dispose();
- log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl);
- }
- /**
- * 1、根据关键词位置添加电子印章
- * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作
- * @param wordOldUrl word文件路径
- * @param wordNewUrl 新word文件路径
- * @param stampImgUrl 电子印章图片路径
- * @param keyWord 关键字 (自定义)
- * @param keyWordIndex 关键字索引 (-1)
- * @param horizontal 电子印章水平位置 (260f)
- * @param vertical 电子印章垂直位置 (-55f)
- * @param stampWidth 电子印章宽度 (推荐120)
- * @param stampHeight 电子印章高度(推荐120)
- * @param bookmarkName 书签名,通过名称寻找书签文本所在位置
- * @param newBookmarkText 替换的文本新内容
- */
- public void addKeyWordStamp(
- String wordOldUrl,String wordNewUrl,String stampImgUrl,
- String keyWord,Integer keyWordIndex,Float horizontal,
- Float vertical,Float stampWidth,Float stampHeight,
- String bookmarkName,String newBookmarkText
- ) {
- // 加载文档
- Document document = new Document();
- document.loadFromFile(wordOldUrl);
- // 判断是否需要替换书签位置文本内容
- if (StringUtils.isNotEmpty(bookmarkName)) {
- replaceBookmarkContent(document,bookmarkName,newBookmarkText);
- }
- // 获取关键字位置
- TextSelection[] textSelections = document.findAllString(keyWord, false, false);
- if (ObjectUtils.isNotEmpty(textSelections)) {
- Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph();
- // 添加电子印章
- DocPicture docPicture = paragraph.appendPicture(stampImgUrl);
- // 设置图片位于文字顶层
- docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);
- // 指定电子章位置
- // 水平位置
- docPicture.setHorizontalPosition(horizontal);
- // 垂直位置
- docPicture.setVerticalPosition(vertical);
- // 设置电子章大小
- docPicture.setWidth(stampWidth);
- docPicture.setHeight(stampHeight);
- }
- // 保存添加电子章的Word文档
- document.saveToFile(wordNewUrl);
- document.dispose();
- log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl);
- }
- /**
- * 替换书签名位置文本内容
- * @param document word文档对象
- * @param bookmarkName 书签名
- * @param newBookmarkText 新文本内容
- */
- public void replaceBookmarkContent(Document document,String bookmarkName,String newBookmarkText) {
- //定位到指定书签位置
- BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
- bookmarksNavigator.moveToBookmark(bookmarkName);
- //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致
- bookmarksNavigator.replaceBookmarkContent(newBookmarkText,true);
- }
-
- /**
- * 替换书签名位置文本内容为图片
- * @param document word文档对象
- * @param bookmarkName 书签名
- * @param newImgUrl 图片地址
- */
- public void replaceBookmarkContentToImg(Document document,String bookmarkName,String newImgUrl) {
- //定位到指定书签位置
- BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
- bookmarksNavigator.moveToBookmark(bookmarkName);
- //添加图片,替换原有书签内容
- Paragraph para= new Paragraph(document);
- para.appendPicture(newImgUrl);
- TextBodyPart bodyPart = new TextBodyPart(document);
- bodyPart.getBodyItems().add(para);
- bookmarksNavigator.replaceBookmarkContent(bodyPart);
- }
-
- /**
- * 替换书签名位置文本内容为表格
- * @param document word文档对象
- * @param bookmarkName 书签名
- */
- public void replaceBookmarkContentToTable(Document document,String bookmarkName) {
- //声明数组内容
- String[][] data =
- {
- new String[]{"分类", "等级", "编号"},
- new String[]{"A", "一级", "01A"},
- new String[]{"B", "二级", "02B"},
- new String[]{"C", "三级", "03C"},
- };
- //创建表格
- Table table = new Table(document, true);
- table.resetCells(4, 3);
- for (int i = 0; i < data.length; i++) {
- TableRow dataRow = table.getRows().get(i);
- for (int j = 0; j < data[i].length; j++) {
- TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]);
- range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
- range.getCharacterFormat().setFontName("楷体");
- dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center);
- dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
- }
- }
- //创建TextBodyPart对象
- TextBodyPart bodyPart= new TextBodyPart(document);
- bodyPart.getBodyItems().add(table);
- //定位到指定书签位置
- BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);
- bookmarkNavigator.moveToBookmark(bookmarkName);
- //使用表格替换原书签的内容
- bookmarkNavigator.replaceBookmarkContent(bodyPart);
- }
- /**
- * word转PDF
- * @param wordNewUrl word文件路径
- * @param pdfNewUrl 存储新PDF文件路径
- */
- public void wordToPdf(String wordNewUrl, String pdfNewUrl) {
- // 将新Word文档转换为PDF文件
- Document document = new Document();
- document.loadFromFile(wordNewUrl);
- document.saveToFile(pdfNewUrl, FileFormat.PDF);
- document.dispose();
- log.info("文档转换结束,新PDF文档地址:{}",pdfNewUrl);
- }
- }
复制代码 3、测试
Main主函数测试- public static void main(String[] args) {
- // 目标文件地址
- String wordOldUrl = "src/main/resources/word/20200429宋体服务器同步版.doc";
- // 添加电子印章后文件存放地址
- String wordNewUrl = "src/main/resources/word/20200429宋体服务器同步版2.doc";
- // WORD转PDF存放位置
- String pdfNewUrl = "src/main/resources/pdf/20200429宋体服务器同步版2.pdf";
- // 电子印章图片地址
- String stampImgUrl = "src/main/resources/word/stamp.png";
- // word文档内容关键字
- String keyWord = "盖章";
- // 索引,默认就填-1即可
- Integer keyWordIndex = -1;
- // 电子印章水平位置
- float horizontal = 260f;
- // 电子印章垂直位置
- float vertical = -55f;
- // 电子印章宽度
- float stampWidth = 120;
- // 电子印章高度
- float stampHeight = 120;
- // 书签名
- String bookmarkName = "ZWSTTCJKBH";
- // 书签位置文本替换新内容
- String newBookmarkText = "公开";
- AddStampUtils addStampUtils = new AddStampUtils();
- // 获取关键字位置并加盖印章并替换书签名位置文本内容
- addStampUtils.addKeyWordStamp(wordOldUrl,wordNewUrl,stampImgUrl,keyWord,keyWordIndex,horizontal,vertical,stampWidth,stampHeight,bookmarkName,newBookmarkText);
- // 将新word转化为pdf文件
- addStampUtils.wordToPdf(wordNewUrl,pdfNewUrl);
- }
复制代码 4、效果展示
Before
旧书签位置内容

文档盖章地方:

After


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |