1.合并两个word文件,首页有空白页 2

版本:22.8
编程语言:java

问题1:
合并两个word文件,首页有空白页,而且还多了一些分节符。

问题截图:
image.png (52.4 KB)

源文件:
Desktop.zip (52.2 KB)

合并后的文件:
mergeTest3.zip (26.6 KB)

合并的代码:

// 创建一个新的空白文档对象
		Document mergedDoc = new Document();
		String in = "C:\\Users\\admin\\Desktop\\fillparam2.docx";
		// 加载需要合并的docx文件
		Document doc1 = new Document(in);
		Document doc2 = new Document("C:\\Users\\admin\\Desktop\\文件转换样式测试.docx");

		// 移除mergedDoc的第一页空白内容
		if (mergedDoc.getFirstSection().getBody().getFirstParagraph().getText().trim().isEmpty()) {
			mergedDoc.getFirstSection().getBody().getFirstParagraph().remove();
		}
		for (Paragraph para : (Iterable<Paragraph>) mergedDoc.getChildNodes(NodeType.PARAGRAPH, true)) {
			if (para.toString(SaveFormat.TEXT).trim().isEmpty() && para.isEndOfSection() == false) {
				para.remove();
			}
		}

		// 复制doc1和doc2的内容到新文档对象中
		mergedDoc.appendDocument(doc1, ImportFormatMode.KEEP_SOURCE_FORMATTING);
		mergedDoc.appendDocument(doc2, ImportFormatMode.KEEP_SOURCE_FORMATTING);

		// 在新文档对象中插入目录
		mergedDoc.updateFields();

		// 保存新文档对象为一个新的docx文件
		mergedDoc.save("C:\\Users\\admin\\Desktop\\mergeTest3.docx");

问题2
如何从一个docx文件(仅有一页)中提取页脚,然后添加到其他docx文件中,并且可以指定首页不添加页脚。
包含页脚的示例文件:
页脚 - 副本.zip (17.2 KB)

@ZhonghaoSun 1. 这是一种预期行为。MS Word 文档中的页面设置以及页眉/页脚都是按章节定义的。如果使用 Document.appenDocument,源文档中的整个部分都会复制到目标文档中。这就是为什么在向当前文档添加新文档之前,我们需要添加分节符。

您的情况中保留了第一个空白页,这是因为您试图在默认为空页面的空白文档中添加文档。你可以这样修改代码,以避免出现空白页:

Document doc1 = new Document("input1.docx");
Document doc2 = new Document("input2.docx");

doc1.appendDocument(doc2, ImportFormatMode.KEEP_SOURCE_FORMATTING);
doc1.updateFields();

doc1.save("output.docx");

@ZhonghaoSun 2. 在这种情况下,您需要使用 “setDifferentFirstPageHeaderFooter”。

下面是一个此类操作的示例:

Document srcDoc = new Document("input.docx");
Document dstDoc = new Document();
DocumentBuilder builder = new DocumentBuilder(dstDoc);

builder.getPageSetup().setDifferentFirstPageHeaderFooter(true);

builder.moveToSection(0);
builder.writeln("Page1");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.writeln("Page2");
builder.insertBreak(BreakType.PAGE_BREAK);
builder.writeln("Page3");

HeaderFooter srcFooter = srcDoc.getFirstSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
HeaderFooter srcFooterCopy = (HeaderFooter)dstDoc.importNode(srcFooter, true, ImportFormatMode.KEEP_SOURCE_FORMATTING);

HeaderFooter dstFooter = dstDoc.getFirstSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
if (dstFooter != null)
    dstFooter.remove();

dstDoc.getFirstSection().getHeadersFooters().add(srcFooterCopy);

dstDoc.save("output.docx");

另外,请检查 与页眉和页脚合作 Java|Aspose.Words (单位:千美元) Java

@vyacheslav.deryushev
我使用了word文件的文本替换+文件拼接+添加页脚的操作。
结果是文本替换和拼接都可以,但是页脚没有添加上。

以下是我的代码,麻烦帮忙排查下:

	public static void main(String[] args) {
		//目标文件
		Document dstDoc = new Document("C:\\Users\\admin\\Desktop\\文件转换样式测试.docx");
		//添加版本号
		String cover = "C:\\Users\\admin\\Documents\\EMobile10 Files\\Downloads\\封面-template.docx";
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		Document coverDoc = new Document(cover);
		FindReplaceOptions options = new FindReplaceOptions();
		coverDoc.getRange().replace("{{version}}", "V4.4", options);
		//拼接封面
		coverDoc.appendDocument(dstDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
		coverDoc.updateFields();
		coverDoc.save(out, SaveFormat.DOCX);

		//添加页脚
		Document srcDoc = new Document("C:\\Users\\admin\\Desktop\\页脚.docx");
		Document finalDoc = new Document(new ByteArrayInputStream(out.toByteArray()));
		addFooter(srcDoc, finalDoc, "C:\\Users\\admin\\Desktop\\coverFooterTest44444.docx");
	}
	private static void addFooter(Document srcDoc, Document dstDoc, String saveFileName) throws Exception {
		DocumentBuilder builder = new DocumentBuilder(dstDoc);

		builder.getPageSetup().setDifferentFirstPageHeaderFooter(true);

		HeaderFooter srcFooter = srcDoc.getFirstSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
		HeaderFooter srcFooterCopy = (HeaderFooter) dstDoc.importNode(srcFooter, true, ImportFormatMode.KEEP_SOURCE_FORMATTING);

		HeaderFooter dstFooter = dstDoc.getFirstSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
		if (dstFooter != null)
			dstFooter.remove();

		dstDoc.getFirstSection().getHeadersFooters().add(srcFooterCopy);

		dstDoc.save(saveFileName);
	}

所使用的文件:
Desktop.zip (95.4 KB)

@ZhonghaoSun 在这种情况下,当您使用合并时,在最终文档中有两个部分,您根本不需要使用 builder.getPageSetup().setDifferentFirstPageHeaderFooter(true);。文档中的每个部分都有自己的页眉和页脚。您只需在最后一节添加页脚即可。请像这样更新代码:

private static void addFooter(Document srcDoc, Document dstDoc, String saveFileName) throws Exception {
    HeaderFooter srcFooter = srcDoc.getFirstSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
    HeaderFooter srcFooterCopy = (HeaderFooter) dstDoc.importNode(srcFooter, true, ImportFormatMode.KEEP_SOURCE_FORMATTING);

    HeaderFooter dstFooter = dstDoc.getLastSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.FOOTER_PRIMARY);
    if (dstFooter != null)
        dstFooter.remove();

    dstDoc.getLastSection().getHeadersFooters().add(srcFooterCopy);

    dstDoc.save(saveFileName);
}
1 Like