Java 獲取Word中的所有插入和刪除修訂

iceblue發表於2022-04-20

在 Word 文件中啟用跟蹤更改功能後,會記錄文件中的所有編輯行為,例如插入、刪除、替換和格式更改。對插入或刪除的內容,可通過本文中介紹的方法來獲取。

引入Jar

方法1

手動引入:將 Free Spire.Doc for Java 下載到本地,解壓,找到lib資料夾下的Spire.Doc.jar檔案。在IDEA中開啟如下介面,將本地路徑中的jar檔案引入Java程式:

方法2

通過 Maven 倉庫下載。如下配置pom.xml:

<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
        </repository>
    </repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc.free</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>

獲取插入、刪除的修訂

  • 建立一個 Document 例項並使用 Document.loadFromFile() 方法載入一個示例 Word 文件。
  • 建立一個 StringBuilder 物件,然後使用 StringBuilder.append() 方法記錄資料。
  • 遍歷所有 Section 和 section 中 body 下的每一個元素。
  • 使用 Paragraph.isInsertRevision() 方法確定段落是否為插入修訂。如果是,請使用 Paragraph.getInsertRevision() 方法獲取插入修訂。然後使用 EditRevision.getType() 方法和 EditRevision.getAuthor() 方法獲取修訂型別、作者。
  • 使用 Paragraph.inDeleteRevision() 方法確定段落是否為刪除修訂。如果是,請使用 Paragraph.getDeleteRevision() 方法獲取刪除修訂。然後使用 EditRevision.getType() 方法和 EditRevision.getAuthor() 方法獲取修訂型別、作者。
  • 遍歷段落中的所有元素以獲取文字範圍的修訂。
  • 使用 FileWriter.write() 方法將 StringBuilder 的內容寫入 txt 文件。

Java

import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.fields.TextRange;
import com.spire.doc.formatting.revisions.EditRevision;
import com.spire.doc.formatting.revisions.EditRevisionType;

import java.io.FileWriter;

public class GetAllRevisions {
    public static void main(String[] args)throws Exception {
        //載入示例 Word 文件
        Document document = new Document();
        document.loadFromFile("test.docx");

        //建立一個 StringBuilder 物件以獲取插入修訂
        StringBuilder insertRevision = new StringBuilder();
        insertRevision.append("INSERT REVISIONS:"+"\n");
        int index_insertRevision = 0;

        //建立一個 StringBuilder 物件以獲取刪除修訂
        StringBuilder deleteRevision = new StringBuilder();
        deleteRevision.append("DELETE REVISIONS:"+"\n");
        int index_deleteRevision = 0;

        //遍歷所有節
        for (Section sec : (Iterable<Section>) document.getSections())
        {
            //遍歷section中body下的元素
            for(DocumentObject docItem : (Iterable<DocumentObject>)sec.getBody().getChildObjects())
            {
                if (docItem instanceof Paragraph)
                {
                    Paragraph para = (Paragraph)docItem;
                    //確定段落是否為插入修訂
                    if (para.isInsertRevision())
                    {
                        index_insertRevision++;
                        insertRevision.append("Index: " + index_insertRevision + " \n");
                        //獲取插入修訂
                        EditRevision insRevison = para.getInsertRevision();

                        //獲取插入的段落文字內容
                        String insertRevisionString = para.getText();

                        //獲取插入修訂型別
                        EditRevisionType insType = insRevison.getType();

                        insertRevision.append("Type: " + insType + " \n");
                        //獲取插入修訂作者
                        String insAuthor = insRevison.getAuthor();
                        insertRevision.append("Author: " + insAuthor + " \n" + "InsertPara:"+ insertRevisionString );

                    }

                    //確定段落是否為刪除修訂
                     if (para.isDeleteRevision())
                    {
                        index_deleteRevision++;
                        deleteRevision.append("Index: " + index_deleteRevision + " \n");
                        EditRevision delRevison = para.getDeleteRevision();
                        EditRevisionType delType = delRevison.getType();
                        deleteRevision.append("Type: " + delType + " \n");
                        String delAuthor = delRevison.getAuthor();
                        deleteRevision.append("Author: " + delAuthor + " \n");
                    }
                    //遍歷段落中的元素
                    for(DocumentObject obj : (Iterable<DocumentObject>)para.getChildObjects())
                    {
                        if (obj instanceof TextRange)
                        {
                            TextRange textRange = (TextRange)obj;

                            //確定文字範圍是否為刪除修訂,並獲取刪除修訂的型別、作者及刪除的文字內容。
                            if  (textRange.isDeleteRevision())
                            {
                                index_deleteRevision++;
                                deleteRevision.append("Index: " + index_deleteRevision +" \n");
                                EditRevision delRevison = textRange.getDeleteRevision();
                                EditRevisionType delType = delRevison.getType();
                                deleteRevision.append("Type: " + delType+ " \n");
                                String delAuthor = delRevison.getAuthor();
                                deleteRevision.append("Author: " + delAuthor + " \n");
                                String deletetext = textRange.getText();
                                deleteRevision.append("Delete text:" + deletetext +" \n");
                            }

                            //確定文字範圍是否為插入修訂,並獲取插入修訂的型別、作者及文字內容。
                            else if (textRange.isInsertRevision())
                            {
                                index_insertRevision++;
                                insertRevision.append("Index: " + index_insertRevision +" \n");
                                EditRevision insRevison = textRange.getInsertRevision();
                                EditRevisionType insType = insRevison.getType();
                                insertRevision.append("Type: " + insType + " \n");
                                String insAuthor = insRevison.getAuthor();
                                insertRevision.append("Author: " + insAuthor + " \n");
                                String insertText = textRange.getText();
                                insertRevision.append("insertText:"+insertText);
                            }
                        }
                    }
                }
            }
        }
        //儲存插入修訂內容為txt 檔案
        FileWriter writer1 = new FileWriter("insertRevisions.txt");
        writer1.write(insertRevision.toString());
        writer1.flush();
        writer1.close();

        //儲存刪除修訂內容為txt 檔案
        FileWriter writer2 = new FileWriter("deleteRevisions.txt");
        writer2.write(deleteRevision.toString());
        writer2.flush();
        writer2.close();
    }
}

獲取結果:

 

—END—

 

相關文章