zoukankan      html  css  js  c++  java
  • JAVA合并word文档生成目录

    下载jar包,或者引入相关maven

    maven引入相关地址:https://www.e-iceblue.cn/licensing/install-spirepdf-for-java-from-maven-repository.html

    jar包下载地址:点击下载

    如果不知道怎么引入jar包到项目中,请面向百度。

    如果word文档中已经设置了大纲就直接使用一段代码即可

        public static void main(String[]args){
            //加载测试文档
            Document doc = new Document("测试文件.docx");
    
            //在文档最前面插入一个段落,写入文本并格式化
            Paragraph parainserted = new Paragraph(doc);
            TextRange tr= parainserted.appendText("目 录");
            tr.getCharacterFormat().setBold(true);
            tr.getCharacterFormat().setTextColor(Color.gray);
            doc.getSections().get(0).getParagraphs().insert(0,parainserted);
            parainserted.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
            
            //手动设置文档中指定段落的大纲级别
            doc.getSections().get(0).getParagraphs().get(1).applyStyle(BuiltinStyle.Heading_1);
            doc.getSections().get(0).getParagraphs().get(2).applyStyle(BuiltinStyle.Heading_2);
            doc.getSections().get(0).getParagraphs().get(4).applyStyle(BuiltinStyle.Heading_2);
            doc.getSections().get(0).getParagraphs().get(6).applyStyle(BuiltinStyle.Heading_2);
            doc.getSections().get(0).getParagraphs().get(12).applyStyle(BuiltinStyle.Heading_2);
            doc.getSections().get(0).getParagraphs().get(13).applyStyle(BuiltinStyle.Heading_3);
            doc.getSections().get(0).getParagraphs().get(14).applyStyle(BuiltinStyle.Heading_3);
            doc.getSections().get(0).getParagraphs().get(15).applyStyle(BuiltinStyle.Heading_3);
            doc.getSections().get(0).getParagraphs().get(17).applyStyle(BuiltinStyle.Heading_1);
            doc.getSections().get(0).getParagraphs().get(18).applyStyle(BuiltinStyle.Heading_2);
    
            //添加目录
            doc.getSections().get(0).getParagraphs().get(0).appendTOC(1,3);
    
            //更新目录表
            doc.updateTableOfContents();
    
            //保存文档
            doc.saveToFile("目录.docx",FileFormat.Docx_2010);
        }

    demo来源地址:https://www.e-iceblue.cn/spiredocforjavaformfield/add-word-toc-in-java.html

    下面这个是没有设置大纲的文档生成目录,我的方案是把每页第一段设置为大纲,然后生成目录。

    下面的是合并文档然后生成目录和页码的代码逻辑。

        /**
        *    先临时生成一个合并完成后的docx格式文档,doc会出现乱码。
        * @param pathList 所有需要合并的文档的绝对路径
        * @param savePath 一个路径,但是没有文件的后缀,之后进行拼接。
        * @return 状态,是否保存成功
        */
       public static boolean mergeWordToPdf(List<String> pathList, String savePath){
           //判断是否为pdf文件后缀的路径
    //       String[] split = savePath.split("\.");
    //       if (!"pdf".equals(split[split.length-1])) {
    //           System.out.println("请给一个以pdf保存路径结尾的路径");
    //           return false;
    //       }
           //保存合并完成后临时存放的文件
           String file =  savePath + ".docx";
           File newfile = new File(file);
           try {
               //判断是否存在,存在则删除
               if (newfile.exists()) {
                   newfile.delete();
               }
               newfile.createNewFile();
               //创建一个新的doc文件
               Document doc = new Document(file);
               int count = 0;
               // 进行合并
               for (String filePath : pathList) {
                   // 获取文档的路径,然后合并
                   count++;
                   Document doc2 = new Document();
                   doc2.loadFromFile(filePath);
                   for (int j = 0; j < doc2.getSections().getCount(); j++) {
                       doc.getSections().add(doc2.getSections().get(j).deepClone());
                   }
               }
    
               // 在开头创建一个目录页
               ParagraphStyle title1style = new ParagraphStyle(doc);
               title1style.setName("TL1");
               title1style.getParagraphFormat().setOutlineLevel(OutlineLevel.Level_1);
               doc.getStyles().add(title1style);
               Section sec = doc.getSections().get(0);
               //设置边距
               sec.getPageSetup().getMargins().setTop(71.882f);
               sec.getPageSetup().getMargins().setBottom(71.882f);
               sec.getPageSetup().getMargins().setLeft(90f);
               sec.getPageSetup().getMargins().setRight(90f);
               sec.getParagraphs().get(0).applyStyle(title1style.getName());
    
               //循环遍历每一页的标题,并添加到目录页中
               for (int i = 1; i <= count; i++) {
                   sec = doc.getSections().get(i);
                   sec.getParagraphs().get(0).applyStyle(title1style.getName());
               }
               sec = doc.getSections().get(0);
               Paragraph para = new Paragraph(doc);
               sec.getParagraphs().insert(0, para);
               TableOfContent toc = para.appendTOC(1, 3);
               toc.setUseHeadingStyles(false);
               toc.setUseHyperlinks(true);
               toc.setUseTableEntryFields(false);
               toc.setRightAlignPageNumbers(true);
               toc.setTOCLevelStyle(1, title1style.getName());
               doc.isUpdateFields();
               doc.updateTableOfContents();
    
               //设置目录的字体
               TextRange range = para.appendText("目录");
               range.getCharacterFormat().setFontName("宋体");
               range.getCharacterFormat().setFontSize(16);
               para.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
               sec.getParagraphs().insert(0, para);
               for (int i = 0; i < sec.getParagraphs().getCount(); i++) {
                   Paragraph p = sec.getParagraphs().get(i);
                   if (p.getStyleName().equals("TOC1")) {
                       for (int j = 0; j < p.getChildObjects().getCount(); j++) {
                           if (p.getChildObjects().get(j).getDocumentObjectType().equals(DocumentObjectType.Text_Range)) {
                               TextRange range0 = (TextRange) p.getChildObjects().get(j);
                               range0.getCharacterFormat().setFontName("宋体");
                               range0.getCharacterFormat().setBold(false);
                           }
                       }
                   }
               }
               //删除页眉
               for (int i = 1; i <= count; i++) {
                   ParagraphCollection paragraphsHeader = doc.getSections().get(i).getHeadersFooters().getHeader().getParagraphs();
                   if (paragraphsHeader.getCount() > 0) {
                       paragraphsHeader.removeAt(0);
                   }
                   doc.getSections().get(i).getHeadersFooters().getFirstPageFooter().getChildObjects().clear();
                   doc.getSections().get(i).getHeadersFooters().getOddFooter().getChildObjects().clear();
               }
    
               //添加文字、页码域和总页数域到段落
               Paragraph paragraph = doc.getSections().get(0).getHeadersFooters().getFirstPageFooter().addParagraph();
               paragraph.appendField("page number", FieldType.Field_Page);
               paragraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right);
    
               Paragraph paragraph1 = doc.getSections().get(0).getHeadersFooters().getOddFooter().addParagraph();
               paragraph1.appendField("page number", FieldType.Field_Page);
               paragraph1.getFormat().setHorizontalAlignment(HorizontalAlignment.Right);
               
               //在转换为pdf时出现字体便乱的情况,格式化字体后解决。如果不需要转换为pdf,此操作可以删除。
               for (int a = 1; a <= count; a++) {
                   Section s = doc.getSections().get(a);
                   //更新全文的字体(不包括tbale里的)
                   for (int i = 1; i < s.getParagraphs().getCount(); i++) {
                       Paragraph p = s.getParagraphs().get(i);
                       for (int j = 0; j < p.getChildObjects().getCount(); j++) {
                           if (p.getChildObjects().get(j).getDocumentObjectType().equals(DocumentObjectType.Text_Range)) {
                               TextRange range0 = (TextRange) p.getChildObjects().get(j);
                               range0.getCharacterFormat().setFontName("宋体");
                               range0.getCharacterFormat().setBold(false);
                           }
                       }
                   }
                   TableCollection tables = s.getTables();
                   //更新table里字体
                   if (tables.getCount() > 0) {
                       updateTable(tables);
                   }
               }
    
               //保存word文件
               doc.saveToFile(file, FileFormat.Docx);
               //转换为pdf,转换的代码在下一篇文章里,使用的不是同一个jar包,因为这个jar对生成pdf没有限制,准确的说是破*了。
               //WordToPdfUtil.wordToPdf(file, savePath + ".pdf");return true;
           }catch (Exception e){
               e.printStackTrace();
           }
           return false;
       }

    可能每个人的需求都不一样,不过你可以去查看相关Api或者官方demo进行修改。

    此产品版本是免费版的,我也是在用免费,除了只能单次识别25张一下的word和生成pdf有限制,其他的功能都和正式版差不多。

    如果你几十个文档,每个文档几页,输出出来超过25页,那没关系,依然可以使用。别单个文档超过25页即可。

    如果公司使用,请支持购买收费版。

    转换pdf的文章路径:

    https://www.cnblogs.com/hunmeng/p/11983882.html

  • 相关阅读:
    hdu 1754 线段树 注意线段树节点的设计 求什么,设什么
    hdu 4015 概率题
    poj 1950 回溯
    最大上升子序列
    JVM学习博客
    2012
    i am alone at a crossroads
    易知难
    牢骚。。
    something
  • 原文地址:https://www.cnblogs.com/hunmeng/p/11983701.html
Copyright © 2011-2022 走看看