下载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

JAVA合并多个word文档根据文章标题生成目录的更多相关文章

  1. C# 合并及拆分Word文档

    本文简要分析一下如何如何使用C#简单实现合并和拆分word文档.平时我们在处理多个word文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档中,有的时候也会想要将文档拆分 ...

  2. 用java将简单的word文档换成pdf文档

    用java将简单的word文档换成pdf文档的方式很多,因为很多都没有实际测试过,所以这里就先泛泛的说一下 整体上来看分两种: 1.纯java代码实现,有很多优秀的开源软件可以用,比如poi,itex ...

  3. Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  4. 合并两个word文档,保持样式不变

    一.需求说明 例如将封面插入到word正文上方 二.导入依赖 <dependency> <groupId>org.apache.poi</groupId> < ...

  5. java 导出数据为word文档(保持模板格式)

    导出数据到具体的word文档里面,word有一定的格式,需要保持不变 这里使用freemarker来实现: ①:设计好word文档格式,需要用数据填充的地方用便于识别的长字符串替换  如  aaaaa ...

  6. Java利用aspose-words将word文档转换成pdf(破解 无水印)

    首先下载aspose-words-15.8.0-jdk16.jar包 http://pan.baidu.com/s/1nvbJwnv 引入jar包,编写Java代码 package doc; impo ...

  7. Java将数据写入word文档(.doc)

    Java可用org.apache.poi包来操作word文档.org.apache.poi包可于官网上下载,解压后各jar作用如下图所示: 可根据需求导入对应的jar. 一.HWPFDocument类 ...

  8. Java 合并、拆分PDF文档

    处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...

  9. 用java语言通过POI实现word文档的按标题提取

    最近有一个项目需要将一个word文档中的数据提取到数据库中.就去网上查了好多资料,最靠谱的就是用poi实现word文档的提取. 喝水不忘挖井人,我查了好多资料就这个最靠谱,我的这篇博客主要是借鉴htt ...

随机推荐

  1. transform-origin盒子旋转位置

    transform-Origin属性允许您更改转换元素的位置. 2D转换元素可以改变元素的X和Y轴. 3D转换元素,还可以更改元素的Z轴. 为了更好地理解Transform-Origin属性,请查看这 ...

  2. iSCSI 共享存储

         iSCSI(Internet Small Computer System Interface,发音为/ˈаɪskʌzi/),Internet小型计算机系统接口,又称为IP-SAN,是一种基于 ...

  3. 无聊的 邮递员 插头dp

    邮递员想知道,如果他每天都用不同路线走过10×20个点阵邮筒,他必须活过多少个世纪才能走遍所有方案? 7:00 改完T1,开始肝插头dp 7:10 放弃,颓博客 7:20 学习插头dp 7:21 放弃 ...

  4. STL&&用法集合

    .....STL是c++里很强势很好用的一系列容器(函数)之类的,之前一直不太会用,所以总是暴毙....想着快比赛了,是时候理一下这些东西了. -1.pair 存放两个基本元素的东西 定义方法: pa ...

  5. 考试T3麻将

    这题就是一个简单的暴力,但考试的时候不知道脑子在想什么,什么都没打出来,也许是我想的太多了... 这道题对于不会打麻将的人来说还是有点难理解规则的,我没说过我会打麻将,这里是题目链接. 20分思路,利 ...

  6. 基于 HTML5 + WebGL 实现 3D 挖掘机系统

    前言 在工业互联网以及物联网的影响下,人们对于机械的管理,机械的可视化,机械的操作可视化提出了更高的要求.如何在一个系统中完整的显示机械的运行情况,机械的运行轨迹,或者机械的机械动作显得尤为的重要,因 ...

  7. 利用JaCoCo统计接口测试中代码覆盖率

    ​        做接口测试,很多时候都会听到,你接口测试的覆盖率是多少?很多人会回答80%,你怎么统计的,他说覆盖了80%的需求.这个回答没有错误,但是片面,我们不能只考虑需求的覆盖率,还有业务的覆 ...

  8. C#:转义字符 \n 和 \r 的区别

    1.\n,换行符,作用是换行符之后的字符换到下一行: 例如:1234/n567    得出的结果是1234 567 2.而\r,回车符,作用是回车符之后的字符会回到当前行的最前面,把回车符之前的字符覆 ...

  9. Python3.7.1学习(三)求两个list的差集、并集与交集

    在python3.7.1对列表的处理中,会经常使用到Python求两个list的差集.交集与并集的方法. 下面就以实例形式对此加以分析. # 求两个list的差集.并集与交集# 一.两个list差集# ...

  10. java中hashmap容量的初始化

    HashMap使用HashMap(int initialCapacity)对集合进行初始化. 在默认的情况下,HashMap的容量是16.但是如果用户通过构造函数指定了一个数字作为容量,那么Hash会 ...