版本: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