aspose通过开始和结束位置关键词截取word另存为新文件

news2024/11/25 1:40:20

 关键词匹配实体类:

@Data
@EqualsAndHashCode(callSuper = false)
public class TextConfig implements Serializable {

    private static final long serialVersionUID = 1L;

    
    /**
     * 开始关键词,多个逗号分隔
     */
    private String textStart ;

    /**
     * 结束关键词,多个逗号分隔
     */
    private String textEnd ;

    /**
     * 包含关键词,多个逗号分隔
     */
    private String textInclude ;

    /**
     * 不包含关键词,多个逗号分隔
     */
    private String textExclude ;

}
import com.aspose.words.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.*;


@EqualsAndHashCode(callSuper = false)
@Slf4j
@Data
public class WordResolve extends Document {
    /**
     * 查找文本类型另存为word
     * @param filePathName  文件保存路径
     * @param copyFirst     是否复制关键词开始节点
     * @param copyLast      是否复制关键词结束节点
     */
    @SneakyThrows
    public File findBetweenFile(TextConfig textConfig, String filePathName, boolean copyFirst, boolean copyLast) {
        List<Paragraph> paragraphs = getAllParagraph();
        Integer[] sec = findBetweenIndex(textConfig,getAllText());
        if(sec == null){
            return null;
        }
        Document doc = new Document();
        Body body = doc.getFirstSection().getBody();
        body.removeAllChildren();
        NodeImporter importer = new NodeImporter(this, doc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
        Paragraph first = paragraphs.get(sec[0]);
        Paragraph last = paragraphs.get(sec[1]);

        List<CompositeNode<?>> parentNodes = new ArrayList<>(20);

        boolean startCopying = false;
        //读取文档的所有节点
        NodeCollection<?> allNodeList = this.getChildNodes(NodeType.ANY, true);
        for (int i = 0, j = allNodeList.getCount(); i < j; i++) {
            Node node = allNodeList.get(i);
            try{
                if (node == first) {
                    startCopying = true;
                    if(!copyFirst){
                        continue;
                    }
                }
                if (node == last && !copyLast) {
                    // 到达结束节点后停止复制
                    break;
                }
                if (startCopying) {
                    boolean append = true;
                    for (CompositeNode<?> parentNode : parentNodes) {
                        NodeCollection<?> childNodes = parentNode.getChildNodes(node.getNodeType(), true);
                        if(childNodes.contains(node)){
                            append = false;
                            break;
                        }
                    }
                    if(append){
                        try{
                            body.appendChild(importer.importNode(node, true));
                        }catch (Exception e){
                            log.error("插入节点出错:{}",e.getMessage());
                            //ignore
                        }
                    }
                }
                if (node == last) {
                    // 到达结束节点后停止复制
                    break;
                }
            }finally {
                if(startCopying && node.isComposite()){
                    CompositeNode<?> compositeNode = (CompositeNode<?>) node;
                    if(!parentNodes.contains(compositeNode)){
                        parentNodes.add(compositeNode);
                    }
                }
            }
        }
        File file = FileUtils.getFile(filePathName);
        doc.save(filePathName);
        return file;
    }

    /**
     * 查找文本类型解析规则的开始结束段落索引
     * @param   strings word全部段落,每个段落的文本
     */
    public Integer[] findBetweenIndex(TextConfig textConfig, List<String> strings){
        String textStart = textConfig.getTextStart();
        String textEnd = textConfig.getTextEnd();
        //规定开始关键词必须包含哪些文字,多个逗号分隔(作为附加判断,可为空)
        textInclude = StringUtil.defaultString(textConfig.getTextInclude(), "").replace(",", "");
        //规定结束关键词必须不包含哪些文字,多个逗号分隔(作为附加判断,可为空)
        textExclude = StringUtil.defaultString(textConfig.getTextExclude(), "").replace(",", "");
        String[] in = StringUtil.isBlank(textInclude) ? null : textInclude.split(",");
        String[] out = StringUtil.isBlank(textExclude) ? null : textExclude.split(",");
        //满足开始位置和结束位置的全部关键词索引
        List<Integer> startArr = new ArrayList<>();
        List<Integer> endArr = new ArrayList<>();

        for (int i = 0; i < strings.size(); i++) {
            String text = strings.get(i);
            if (text.contains(textStart)) {
                startArr.add(i);
            }
            if (text.contains(textEnd)) {
                endArr.add(i);
            }
        }
        //进行包含和非包含的判断过滤
        if(!startArr.isEmpty() && !endArr.isEmpty()){
            for (Integer start : startArr) {
                for (Integer end : endArr) {
                    //中间至少隔了一个段落
                    if(start + 1 < end){
                        StringJoiner jo = new StringJoiner("\n");
                        for (int i = start + 1; i < end; i++) {
                            jo.add(strings.get(i));
                        }
                        String word = jo.toString();
                        boolean match = true;
                        if(in != null){
                            for (String s : in) {
                                if(!word.contains(s)){
                                    match = false;
                                    break;
                                }
                            }
                        }
                        if(match && out != null){
                            for (String s : out) {
                                if(word.contains(s)){
                                    match = false;
                                    break;
                                }
                            }
                        }
                        if(match){
                            return new Integer[]{start,end};
                        }
                    }
                }
            }
        }
        return null;
    }

    /**
     * 拿到文档全部段落文本
     */
    public List<String> getAllText(){
        List<String> strings = new ArrayList<>();
        getAllParagraph().forEach(a-> strings.add(StringTool.safeToString(a.getText(), "")));
        return strings;
    }

    /**
     * 拿到文档全部段落
     */
    public List<Paragraph> getAllParagraph(){
        if(allParagraph == null){
            allParagraph = findNodeByType(NodeType.PARAGRAPH, Paragraph.class);
        }
        return allParagraph;
    }
}

使用方式:

word文档内容如下:

要截取标题三和标题四之间的内容,生成新的word,代码如下:

public class Test {

    public static void main(String[] args) throws Exception{
        //验证license
        //new AsposeLicense().validate();
        //读取word文件
        WordResolve word = new WordResolve(new File("C:\\Users\\zhou\\Desktop\\测试.docx"));
        TextConfig detail = new TextConfig();
        detail.setTextStart("poi导出大数据量问题、写入速度慢");
        detail.setTextEnd("国密验签失败");
        File betweenFile = word.findBetweenFile(detail, "C:\\Users\\zhou\\Desktop\\betweenFile.docx", false, false);
        System.out.println(betweenFile);
    }


}

 截取保存的文件如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第 6 章 统计量及其抽样分布

统计量 卡方分布&#xff0c;t分布&#xff0c;f分布 样本均值的抽样分布 中心极限定理 样本比例的的抽样分布 两个均值之差的抽样分布 样本方差的分布&#xff08;重要&#xff09; 两个样本方差比的分布 注意理解下面这个图里面的定义&#xff08;比较重要&#xff09…

从公司代码仓库更新代码出现错误

错误&#xff1a; 解决&#xff1a;点击idea右上角&#xff0c;将远程代码和本地合并

RDS快速入门

目录 实例创建 设置白名单 RDS&#xff08;Relational Database Service&#xff09;是一种托管式的关系型数据库服务&#xff0c;它为用户提供了一种简单、可靠、安全的方式来部署、操作和扩展数据库。具有安全可靠、解决运维烦恼、有效降低成本和自研增加等四大特性&#x…

都2024年了!你还不知道在Docker中安装jdk?

目录 前言&#xff1a; Docker安装JDK(8) 查看以及安装的镜像 拉取JDK&#xff08;8&#xff09;的镜像文件 ​编辑 运行容器 进入容器 检查安装 如果我的博客帮助到你&#xff0c;麻烦点个小小的赞即可 前言&#xff1a; 在2024年&#xff0c;Docker已经成为了容器化…

docker搭建Dinky —— 筑梦之路

简介 Dinky 是一个 开箱即用 、易扩展 &#xff0c;以 Apache Flink 为基础&#xff0c;连接 OLAP 和 数据湖 等众多框架的 一站式 实时计算平台&#xff0c;致力于 流批一体 和 湖仓一体 的探索与实践。 主要功能 其主要功能如下&#xff1a; 沉浸式 FlinkSQL 数据开发&#x…

java SSM投票管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM投票管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和 数据库&#xff0c;系统主要采用B/…

我的CSDN 512天创作者纪念日总结:高效、高现

文章目录 512天创作者纪念日&#xff1a;2023年的12月31日CSDN的512天消息提醒第一篇文章&#xff0c;最后一篇文章总计847篇文章&#xff0c;每月发文分布512天&#xff0c;各专栏文章统计512天&#xff0c;互动总成绩 512天创作者纪念日&#xff1a;2023年的12月31日 2023年…

一个WPF版的Layui前端UI库

前言 相信做.NET后端开发的很多小伙伴都用过Layui前端UI组件库&#xff0c;今天我们分享一个WPF版的Layui前端UI样式库&#xff1a;Layui-WPF。 WPF介绍 WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-6-元素定位大法-下篇

1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的定位方法的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下&#xff0c;在日常中很少用到或者很少见的定位&#xff0c;但是遇到了我们也要会&#xff0c;俗话说&#xf…

Origin 2022软件安装包下载及安装教程

Origin 2022https://docs.qq.com/doc/DUklGWUhMVEZTbUVU 1、选中下载好的安装包&#xff0c;右键选择解压到“Origin 2022”文件夹 2、选中“Setup.exe”右键以管理员身份运行 3、点击“下一步” 4、选择“我接受……”&#xff0c;点击"下一步" 5、选择“安装origi…

Vue中全局事件总线的配置和原理

实现任意组件之间的通信 任意组件通信的原理&#xff1a; 1、实现任意组件之间的通信,需要一个傀儡。这个傀儡既能被vm访问到,也能被VueComponent访问。 2、VueComponent.prototype.proto Vue.prototype为图上1.0黄色的线路。是Vue让组件实例对象VueComponent可以访问到Vue原…

SSM学生成绩信息管理系统----计算机毕业设计

项目介绍 本项目分为管理员、教师、学生三种角色&#xff0c; 管理员角色包含以下功能&#xff1a; 公告管理,写公告,学生增删改查,教师增删改查,查看成绩报表,管理员首页,课程表增删改查等功能。 教师角色包含以下功能&#xff1a; 修改密码,按照条件查询,查看学生信息,管理…

【k8s】deamonset文件和说明

目录 deamonset的相关命令 deamonset的定义 deamonset的使用场景 deamonset的例子 deamonset字段说明 serviceAccountName DaemonSet的结构及其各个部分的作用 deamonset的相关命令 #查看<name-space>空间内有哪些deamonset kubectl get DaemonSet -n <na…

关于Python里xlwings库对Excel表格的操作(二十七)

这篇小笔记主要记录如何【如何使用xlwings库的“Charts类” 在一个工作表中创建多个图表】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &…

分布式定时任务Xxl_Job详细使用手册

看了很多网上的版本&#xff0c;思路描述的都不是很清晰&#xff0c;都只是几步操作就完成了&#xff0c;看效果&#xff0c;导致容易走入弯路&#xff08;不排除是自己理解能力把&#xff09;&#xff0c;最开始以为是把admin模块集成到项目&#xff0c;后来测试了会&#xff…

ubuntu terminator 非常好用的护眼配置

安装 sudo apt install terminator 配置文件&#xff1a;sudo gedit ~/.config/terminator/config &#xff08;如果没有就创建&#xff09; 配置如下&#xff1a; [global_config] handle_size -3 title_transmit_fg_color "#000000" title_trans…

YOLOv8训练损失、mAP画图功能 | 支持多结果对比,多结果绘在一个图片(科研必备)

一、本文介绍 本文给大家带来的是YOLOv8系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

稳部落 – 新浪微博备份导出工具

稳部落 稳部落是新浪微博备份导出工具&#xff0c;可以帮助用户非常方便的导出备份新浪微博的数据&#xff0c;让我们可以永久保存这些微博数据。它支持新浪微博、微博私信、微博评论的导出&#xff0c;并可以备份包含图片、视频的完整微博内容。用户只需登录微博账号&#xf…

浅学一下哈

1.新建用户test不建家目录不允许登录&#xff0c;uid为10086_____________________ useradd -u 10086 -M -s /sbin/nologin 2.将 /opt 文件夹中所有文件的属主&#xff0c;属组改成&#xff0c;test_______________________ chown -R test.test /opt chown -R …

小红书、抖音、视频号下载工具:随心管理个人作品集 | 开源日报 No.134

karanpratapsingh/system-design Stars: 20.6k License: NOASSERTION 这个项目是关于系统设计的。它提供了有关系统设计的课程内容&#xff0c;包括 IP、OSI 模型、TCP 和 UDP 等主题。该项目的核心优势和特点如下&#xff1a; 提供全面而高效的系统架构定义。从基础设施到数…