开发

软件开发相关知识

使用Aspose.word 合并word文档到指定位置

使用java开发时,碰到一个需求,需要在一个word文件指定位置嵌套另一个word文件中的内容,通过以下代码实现:

package com.macrochina.mis.tools;

import com.aspose.words.*;
import org.springframework.boot.system.ApplicationHome;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class AsposeWordHandler {
    public void main(String[] args) throws IOException {

        //在文档指定位置处插入其他文件。docPosition为自定义符号。
        DocInsert("{{insertFilePosition}}", "D:/temp/main.docx", "D:/temp/1.docx", "D:/temp/2.docx", true);

    }

    /**
     * 在 mainWord 文档指定位置处插入其他文件。docPosition 为自定义符号。
     *
     * @param docPosition 主文件 mainWord 中的特定文件的位置,本实例以 {{insertFilePosition}} 标识
     * @param mainWord    主文件
     * @param AddWord     往主文件中添加的附加文件
     * @param outWord     输出文件
     * @param isPortrait  横向还是纵向
     */
    public void DocInsert(String docPosition, String mainWord, String AddWord, String outWord, boolean isPortrait) {
        if (!getLicense()) {
            System.out.println("Aspose_word_License Error!");
        }
        try {
            // 使用Aspose.words 加载要处理的文档 mainWord
            Document doc = new Document(mainWord);
            // 获取需要进行追加的文档 addWord
            Document addDocument = new Document(AddWord);
            // 创建一个文本生成构造器 builder
            DocumentBuilder Builder = new DocumentBuilder(doc);

            NodeCollection runs = doc.getChildNodes(NodeType.PARAGRAPH, true); //获取所有节点

            for (int i = 0; i < runs.getCount(); i++) {
                Paragraph r = (Paragraph) runs.get(i);
                String text = r.getRange().getText();//获取段落文本
                //获取到标志点位
                if (text.length() >= docPosition.length() && text.indexOf(docPosition) >= 0) {
                    //指定段落插入表格
                    Builder.moveTo(r);
                    Builder.getPageSetup().setPaperSize(PaperSize.A4);
                    if (isPortrait) {
                        Builder.getPageSetup().setOrientation(Orientation.PORTRAIT);
                    } else {
                        Builder.getPageSetup().setOrientation(Orientation.LANDSCAPE);
                    }

                    Node insertAfterNode = Builder.getCurrentParagraph().getPreviousSibling();
                    insertDocumentAfterNode(insertAfterNode, doc, addDocument);
                    r.remove();//删除标志点位所在行
                    break;
                }
            }
            //doc.updateFields(); // 因为文档结构变动可能需要更新目录
            doc.save(outWord); // 保存合并后的新文件
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 在指定位置插入新文件信息
     *
     * @param insertAfterNode 插入的位置
     * @param mainDoc         主文档
     * @param srcDoc          要拼接进去的文档
     * @throws Exception 异常捕获
     */
    private void insertDocumentAfterNode(Node insertAfterNode, Document mainDoc, Document srcDoc) throws Exception {
        if (insertAfterNode.getNodeType() != 8 && insertAfterNode.getNodeType() != 5) {
            throw new Exception("The destination node should be either a paragraph or table.");
        } else {
            CompositeNode dstStory = insertAfterNode.getParentNode();
            Body body = srcDoc.getLastSection().getBody();
            while (null != body.getLastParagraph() && !body.getLastParagraph().hasChildNodes()) {
                srcDoc.getLastSection().getBody().getLastParagraph().remove();
            }

            NodeImporter importer = new NodeImporter(srcDoc, mainDoc, ImportFormatMode.KEEP_SOURCE_FORMATTING);
            int sectCount = srcDoc.getSections().getCount();

            for (int sectIndex = 0; sectIndex < sectCount; ++sectIndex) {
                Section srcSection = srcDoc.getSections().get(sectIndex);
                int nodeCount = srcSection.getBody().getChildNodes().getCount();
                for (int nodeIndex = 0; nodeIndex < nodeCount; ++nodeIndex) {
                    Node srcNode = srcSection.getBody().getChildNodes().get(nodeIndex);
                    Node newNode = importer.importNode(srcNode, true);
                    dstStory.insertAfter(newNode, insertAfterNode);
                    insertAfterNode = newNode;
                }
            }
        }
    }


    /**
     * 获取aspose.words的license文件
     * @return license文件是否正常
     */
    public boolean getLicense() {
        boolean result = false;
        try {
            ApplicationHome home = new ApplicationHome(getClass());
            File jarFile = home.getSource();
            //System.out.println("=================" + jarFile.getParentFile().getParentFile().toString());
            File file = new File(jarFile.getParentFile().getParentFile().toString() + "/license.xml");
            if (file.exists()) {
                InputStream is = new FileInputStream(file);
                License aposeLic = new License();
                aposeLic.setLicense(is);
                result = true;
            }
        } catch (Exception e) { //异常处理
            e.printStackTrace();
        }
        return result;
    }


}