Word书签替换,加盖电子印章及转换PDF(Java实用版)

王柳  金牌会员 | 2022-8-27 13:37:56 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 539|帖子 539|积分 1617

一、前言

在项目中有需要对word进行操作的,可以看看哈,本次使用比较强大的spire组件来对word进行操作,免费版支持三页哦,对于不止三页的word文件,可以购买收费版,官网:https://www.e-iceblue.cn/tutorials.html#,也可使用其他组件实现,如poi、docx4j等,我将代码整理成工具类了,大家可以拿下来直接使用哈,一起努力吧。
二、Spire的使用

1、引入pom.xml
  1. <dependency>
  2.     <groupId>e-iceblue</groupId>
  3.     <artifactId>spire.office.free</artifactId>
  4.     <version>5.3.1</version>
  5. </dependency>
复制代码
2、AddStampUtils

工具类
  1. /**
  2. * @Author:wk
  3. * @Slogan:无论风雨,和自己一决胜负吧
  4. * @Create:2022/7/15/9:30
  5. * @Description:TODO Word文件操作工具类
  6. * @Version:1.0
  7. */
  8. @Slf4j
  9. public class AddStampUtils {
  10. //    转换目标文件地址
  11. //    public static String WORD_OLD_URL = "src/main/resources/word/20200429宋体服务器同步版.doc";
  12. //    转换后文件存放地址
  13. //    public static String WORD_NEW_URL = "src/main/resources/word/20200429宋体服务器同步版2.doc";
  14. //    WORD转PDF存放位置
  15. //    public static String PDF_NEW_URL = "src/main/resources/pdf/20200429宋体服务器同步版2.pdf";
  16. //    电子印章图片地址
  17. //    public static String STAMP_IMG_URL = "src/main/resources/word/stamp.png";
  18.     /**
  19.      * 1、自定义位置添加电子印章
  20.      * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作
  21.      * @param wordOldUrl word文件路径
  22.      * @param wordNewUrl 新word文件路径
  23.      * @param stampImgUrl 电子印章图片路径
  24.      * @param horizontal 电子印章水平位置 (当前文件推荐260f)
  25.      * @param vertical 电子印章垂直位置 (当前推荐455f)
  26.      * @param stampWidth 电子印章宽度(推荐120)
  27.      * @param stampHeight 电子印章高度(推荐120)
  28.      * @param bookmarkName 书签名,通过名称寻找书签文本所在位置
  29.      * @param newBookmarkText 替换的文本新内容
  30.      */
  31.     public void addStamp(
  32.         String wordOldUrl,String wordNewUrl,String stampImgUrl,
  33.         Float horizontal,Float vertical,Float stampWidth,
  34.         Float stampHeight,String bookmarkName,String newBookmarkText
  35.     ) {
  36.         //        加载文档
  37.         Document document = new Document();
  38.         document.loadFromFile(wordOldUrl);
  39. //        获取指定段落
  40.         Section section = document.getSections().get(0);
  41. //        获取段落总数
  42.         int count = section.getParagraphs().getCount();
  43.         log.info("获取文档内容段落总数{}",count);
  44.         Paragraph paragraph = section.getParagraphs().get(0);
  45.         //        判断是否需要替换书签位置文本内容
  46.         if (StringUtils.isNotEmpty(bookmarkName)) {
  47.             replaceBookmarkContent(document,bookmarkName,newBookmarkText);
  48.         }
  49. //        添加电子印章
  50.         DocPicture docPicture = paragraph.appendPicture(stampImgUrl);
  51. //        指定电子章位置
  52. //        水平位置
  53.         docPicture.setHorizontalPosition(horizontal);
  54. //        垂直位置
  55.         docPicture.setVerticalPosition(vertical);
  56. //        设置电子章大小
  57.         docPicture.setWidth(stampWidth);
  58.         docPicture.setHeight(stampHeight);
  59. //        设置图片位于文字顶层
  60.         docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);
  61.         //        保存添加电子章的Word文档
  62.         document.saveToFile(wordNewUrl);
  63.         document.dispose();
  64.         log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl);
  65.     }
  66.     /**
  67.      * 1、根据关键词位置添加电子印章
  68.      * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作
  69.      * @param wordOldUrl word文件路径
  70.      * @param wordNewUrl 新word文件路径
  71.      * @param stampImgUrl 电子印章图片路径
  72.      * @param keyWord 关键字 (自定义)
  73.      * @param keyWordIndex 关键字索引 (-1)
  74.      * @param horizontal 电子印章水平位置 (260f)
  75.      * @param vertical 电子印章垂直位置 (-55f)
  76.      * @param stampWidth 电子印章宽度 (推荐120)
  77.      * @param stampHeight 电子印章高度(推荐120)
  78.      * @param bookmarkName 书签名,通过名称寻找书签文本所在位置
  79.      * @param newBookmarkText 替换的文本新内容
  80.      */
  81.     public void addKeyWordStamp(
  82.             String wordOldUrl,String wordNewUrl,String stampImgUrl,
  83.             String keyWord,Integer keyWordIndex,Float horizontal,
  84.             Float vertical,Float stampWidth,Float stampHeight,
  85.             String bookmarkName,String newBookmarkText
  86.     ) {
  87.         //        加载文档
  88.         Document document = new Document();
  89.         document.loadFromFile(wordOldUrl);
  90. //        判断是否需要替换书签位置文本内容
  91.         if (StringUtils.isNotEmpty(bookmarkName)) {
  92.             replaceBookmarkContent(document,bookmarkName,newBookmarkText);
  93.         }
  94. //        获取关键字位置
  95.         TextSelection[] textSelections = document.findAllString(keyWord, false, false);
  96.         if (ObjectUtils.isNotEmpty(textSelections)) {
  97.             Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph();
  98.             //        添加电子印章
  99.             DocPicture docPicture = paragraph.appendPicture(stampImgUrl);
  100.             //        设置图片位于文字顶层
  101.             docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);
  102.             //        指定电子章位置
  103.             //        水平位置
  104.             docPicture.setHorizontalPosition(horizontal);
  105.             //        垂直位置
  106.             docPicture.setVerticalPosition(vertical);
  107.             //        设置电子章大小
  108.             docPicture.setWidth(stampWidth);
  109.             docPicture.setHeight(stampHeight);
  110.         }
  111. //        保存添加电子章的Word文档
  112.         document.saveToFile(wordNewUrl);
  113.         document.dispose();
  114.         log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl);
  115.     }
  116.     /**
  117.      * 替换书签名位置文本内容
  118.      * @param document word文档对象
  119.      * @param bookmarkName 书签名
  120.      * @param newBookmarkText 新文本内容
  121.      */
  122.     public void replaceBookmarkContent(Document document,String bookmarkName,String newBookmarkText) {
  123.         //定位到指定书签位置
  124.         BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
  125.         bookmarksNavigator.moveToBookmark(bookmarkName);
  126.         //用文本内容替换原有书签位置的文本,新替换的内容与原文格式一致
  127.         bookmarksNavigator.replaceBookmarkContent(newBookmarkText,true);
  128.     }
  129.    
  130.     /**
  131.      * 替换书签名位置文本内容为图片
  132.      * @param document word文档对象
  133.      * @param bookmarkName 书签名
  134.      * @param newImgUrl 图片地址
  135.      */
  136.     public void replaceBookmarkContentToImg(Document document,String bookmarkName,String newImgUrl) {
  137.         //定位到指定书签位置
  138.         BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
  139.         bookmarksNavigator.moveToBookmark(bookmarkName);
  140.         //添加图片,替换原有书签内容
  141.         Paragraph para= new Paragraph(document);
  142.         para.appendPicture(newImgUrl);
  143.         TextBodyPart bodyPart = new TextBodyPart(document);
  144.         bodyPart.getBodyItems().add(para);
  145.         bookmarksNavigator.replaceBookmarkContent(bodyPart);
  146.     }
  147.    
  148.     /**
  149.      * 替换书签名位置文本内容为表格
  150.      * @param document word文档对象
  151.      * @param bookmarkName 书签名
  152.      */
  153.     public void replaceBookmarkContentToTable(Document document,String bookmarkName) {
  154.         //声明数组内容
  155.         String[][] data =
  156.         {
  157.                 new String[]{"分类", "等级", "编号"},
  158.                 new String[]{"A", "一级", "01A"},
  159.                 new String[]{"B", "二级", "02B"},
  160.                 new String[]{"C", "三级", "03C"},
  161.         };
  162.         //创建表格
  163.         Table table = new Table(document, true);
  164.         table.resetCells(4, 3);
  165.         for (int i = 0; i < data.length; i++) {
  166.             TableRow dataRow = table.getRows().get(i);
  167.             for (int j = 0; j < data[i].length; j++) {
  168.                 TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]);
  169.                 range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
  170.                 range.getCharacterFormat().setFontName("楷体");
  171.                 dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center);
  172.                 dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
  173.             }
  174.         }
  175.         //创建TextBodyPart对象
  176.         TextBodyPart bodyPart= new TextBodyPart(document);
  177.         bodyPart.getBodyItems().add(table);
  178.         //定位到指定书签位置
  179.         BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);
  180.         bookmarkNavigator.moveToBookmark(bookmarkName);
  181.         //使用表格替换原书签的内容
  182.         bookmarkNavigator.replaceBookmarkContent(bodyPart);
  183.     }
  184.     /**
  185.      * word转PDF
  186.      * @param wordNewUrl word文件路径
  187.      * @param pdfNewUrl  存储新PDF文件路径
  188.      */
  189.     public void wordToPdf(String wordNewUrl, String pdfNewUrl) {
  190. //        将新Word文档转换为PDF文件
  191.         Document document = new Document();
  192.         document.loadFromFile(wordNewUrl);
  193.         document.saveToFile(pdfNewUrl, FileFormat.PDF);
  194.         document.dispose();
  195.         log.info("文档转换结束,新PDF文档地址:{}",pdfNewUrl);
  196.     }
  197. }
复制代码
3、测试

Main主函数测试
  1.  public static void main(String[] args) {
  2.     //       目标文件地址
  3.     String wordOldUrl = "src/main/resources/word/20200429宋体服务器同步版.doc";
  4.     //       添加电子印章后文件存放地址
  5.     String wordNewUrl = "src/main/resources/word/20200429宋体服务器同步版2.doc";
  6.     //       WORD转PDF存放位置
  7.     String pdfNewUrl = "src/main/resources/pdf/20200429宋体服务器同步版2.pdf";
  8.     //        电子印章图片地址
  9.     String stampImgUrl = "src/main/resources/word/stamp.png";
  10.     //        word文档内容关键字
  11.     String keyWord = "盖章";
  12.     //        索引,默认就填-1即可
  13.     Integer keyWordIndex = -1;
  14.     //        电子印章水平位置
  15.     float horizontal = 260f;
  16.     //        电子印章垂直位置
  17.     float vertical = -55f;
  18.     //        电子印章宽度
  19.     float stampWidth = 120;
  20.     //        电子印章高度
  21.     float stampHeight = 120;
  22.     //        书签名
  23.     String bookmarkName = "ZWSTTCJKBH";
  24.     //        书签位置文本替换新内容
  25.     String newBookmarkText = "公开";
  26.     AddStampUtils addStampUtils = new AddStampUtils();
  27.     //        获取关键字位置并加盖印章并替换书签名位置文本内容
  28.     addStampUtils.addKeyWordStamp(wordOldUrl,wordNewUrl,stampImgUrl,keyWord,keyWordIndex,horizontal,vertical,stampWidth,stampHeight,bookmarkName,newBookmarkText);
  29.     //        将新word转化为pdf文件
  30.     addStampUtils.wordToPdf(wordNewUrl,pdfNewUrl);
  31. }
复制代码
4、效果展示

Before

旧书签位置内容

文档盖章地方:

After



 

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表