用于 apche poi docx 的 HTML 解析器将 html 插入到段落

如何解决用于 apche poi docx 的 HTML 解析器将 html 插入到段落

我正在尝试使用 apache poi 将 html 插入 docx。 Jsoup 非常适合解析 html,这个答案对我帮助很大,但我坚持将 UL 和 LI 插入 docx 作为在新位置插入段落 cozing 问题

对我有帮助的问题:How to set define different styles for the same paragraph

我添加的 ULparser :

public class UnorderedListParser implements NodeVisitor {

      String nodeName;
      boolean needNewRun;
      boolean isItalic;
      boolean isBold;
      boolean isUnderlined;
      int fontSize;
      boolean insertImage = false;
      Node anchorNode= null;
      boolean liStarted = false;
      String fontColor;
      final CSSOMParser parser = new CSSOMParser();

      XWPFParagraph paragraph;
      XWPFRun run;
     
      List<String> textList = new ArrayList<String>();
      UnorderedListParser(XWPFParagraph paragraph) {
       this.paragraph = paragraph;
       this.run = paragraph.createRun();
       this.nodeName = "";
       this.needNewRun = false;
       this.isItalic = false;
       this.isBold = false;
       this.isUnderlined = false;
       this.fontSize = 11;
       this.fontColor = "000000";
       this.insertImage = false;
       
      }

      @Override
      public void head(Node node,int depth) {
          nodeName = node.nodeName();
          System.out.println("Start1 "+nodeName+": " + node);
          if("li".equals(nodeName)) {
              liStarted = true;
          }
          if ("#text".equals(nodeName)) {
              if(liStarted) {
                
                  textList.add(((TextNode)node).text());
              }
          }
        
       
      }

      @Override
      public void tail(Node node,int depth) {
       nodeName = node.nodeName();

            System.out.println("End1 "+nodeName);
            if("li".equals(nodeName)) {
                  liStarted = false;
              }
            if("ul".equals(nodeName)) {
                try {
                    System.out.println("gpging into create buleet list");
                    createBulletList(paragraph,run,textList);
                    run = paragraph.createRun();
                }catch(Exception e) {
                    System.out.println("into exception");
                }
            }
      }
      
      
      public static  Map<String,String> getStyleMap(Node element) {
            Map<String,String> keymaps = new HashMap<>();
            if (!element.hasAttr("style")) {
                return keymaps;
            }
            String styleStr = element.attr("style"); // => margin-top:-80px !important;color:#fcc;border-bottom:1px solid #ccc; background-color: #333; text-align:center
            String[] keys = styleStr.split(":");
            String[] split;
            if (keys.length > 1) {
                for (int i = 0; i < keys.length; i++) {
                    if (i % 2 != 0) {
                        split = keys[i].split(";");
                        if (split.length == 1) break;
                        keymaps.put(split[1].trim(),keys[i + 1].split(";")[0].trim());
                    } else {
                        split = keys[i].split(";");
                        if (i + 1 == keys.length) break;
                        keymaps.put(keys[i].split(";")[split.length - 1].trim(),keys[i + 1].split(";")[0].trim());
                    }
                }
            }
            return keymaps;
        }
      
      public static void createBulletList(XWPFParagraph paragraph,XWPFRun run,List<String> documentList) {
          System.out.println("all good");
          CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
          //Next we set the AbstractNumId. This requires care.
          //Since we are in a new document we can start numbering from 0.
          //But if we have an existing document,we must determine the next free number first.
          cTAbstractNum.setAbstractNumId(BigInteger.valueOf(0));
    
          //Bullet list
          CTLvl cTLvl = cTAbstractNum.addNewLvl();
          cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);
          cTLvl.addNewSuff().setVal(STLevelSuffix.SPACE);
          cTLvl.addNewLvlText().setVal("•");
    
          XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
          XWPFNumbering numbering = paragraph.getDocument().createNumbering();
    
          BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
          BigInteger numID = numbering.addNum(abstractNumID);
         
          
          XmlCursor  cursor;
          for (String string : documentList) {
              
              paragraph.setNumID(numID);
               // font size for bullet point in half pt
              paragraph.getCTP().getPPr().addNewRPr().addNewSz().setVal(BigInteger.valueOf(22));
               run = paragraph.createRun();
               run.setText(string);
               run.setFontSize(11);
               cursor = paragraph.getCTP().newCursor();
              cursor.toEndToken();
              while(cursor.toNextToken() != org.apache.xmlbeans.XmlCursor.TokenType.START);

              paragraph =paragraph.getDocument().insertNewParagraph(cursor);
          }
          System.out.println("all good1");
          cursor = paragraph.getCTP().newCursor();
          cursor.toEndToken();
          while(cursor.toNextToken() != org.apache.xmlbeans.XmlCursor.TokenType.START);

          paragraph =paragraph.getDocument().insertNewParagraph(cursor);

      }
      
      public XWPFParagraph returnParagraph() {
          return paragraph;
          
      }

}

this is what it is rendering

我正在使用的 Html :

<p><a href="" target="_blank">dda</a></p><p><br></p><ul><li>1</li><li>2</li><li>3</li></ul><p>CRM stands for<span style="color: rgb(0,0);"> “custom</span><span style="color: rgb(57,92,92);">er relationship management” and it’s software that stores customer contact information like names,addresses,and phone numbers,as well as keeps track of customer activity like website visits,pho</span><span style="color: rgb(0,0);">ne calls,email,and more.</span></p><p><span style="color: rgb(0,0);">Discover Customer 360,the world’s #1 CR</span>M. Connect to your customers in a more intelligent way by uniting sales,service,marketing,commerce,IT,and analytics. All powered by our global community of Trailblazers.</p><p><br></p><p><br></p><p><img src="https://test.com" alt="Porter charge to drop laptop from home2.jpg"></img></p>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res