簡體   English   中英

使用 md5 哈希比較 docx 文件的問題

[英]Issue with docx file comparison using md5 hash

public boolean compareFiles(File newFileInput,File oldFileInput) throws IOException {
    HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
    HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());
    System.out.println("HashCode New File : "+newFile +"\nHashCode Old File : "+oldFile);
    if(newFile.equals(oldFile))
    {
      return true;
    }
    else
    {
       return false;
    }
}

我使用上面的代碼來查找兩個不同的 docx 文件的哈希碼,以便比較它們的文件內容、樣式等。盡管內容和樣式相同,但哈希碼卻不同。

有什么方法可以比較 docx 文件的內容和樣式?

確定兩個復雜的文件類型是否相等總是非常棘手的,如果不是不可能的話。 DOCX 包含的不僅僅是一些文本以及它是否為粗體。

有一些方法可以使文檔看起來完全相同,但具有不同的屬性,並且還保存了許多元數據(例如作者)。 那么這不僅僅是一個技術問題,它更像是一個哲學問題。 讓我給你舉個例子:

您應該比較兩輛車,然后說它們是否相同。 有一些明顯的情況,它們在客觀上是不同的,例如重型卡車和小型城市電動汽車。 但是,如果它們的類型相同,但顏色不同呢? 或者同類型、同顏色但油箱內的油量不同?

DOCX 也是如此。 相同的文字,但不同的顏色? 相同的內容,但不同的作者? 相同……但不同……?

也許您可以透露更多有關您要實現的目標的信息,否則我懷疑我們能否為您提供更多幫助。

如果您真的需要以某種方式比較兩個 DOCX 文件(或任何其他類型的類似復雜性),請找到一個可以解析它們並自己構建邏輯的庫。 然而,人們可能會花費數年時間這樣做而沒有令人滿意的結果。

如果您更喜歡骯臟的 hacky 解決方案,請使用庫來構建文檔頁面的圖像並將它們作為圖像進行比較。 這將確保頁面看起來相同。 但是,根據您對平等的定義,這並不一定意味着它們是相同的文檔。

如果您可以選擇其他文件格式,那么這樣做可能是個好主意。 但是,仍然會有一些棘手的部分。 甚至 Markdown(我們在本網站上用於格式化問答的語言)也無法逐字節進行比較。

This
**weird**
post

將呈現與

This **weird** post

進入

這個奇怪的帖子。

我的問題有很多建議和答案,謝謝。 docx 文件不匹配的原因存在於元數據信息中,每次我們創建 doc/docx 文件時,時間戳都會發生變化。 雖然我試圖更改兩個文件的時間戳(訪問、修改和創建)以使其相同並進行比較,但沒有成功。 原因是除了這些時間戳之外,還有一個稱為 Zip Modify Date 的元信息,當我們看到文件屬性時,它是不可見的。 我發現這個時間戳是哈希碼不匹配的原因之一。 此外,base64 編碼的字符串因 zip 時間戳而不同。

因此,我必須進行比較的選項是:

  1. 將 docx 文件轉換為 xml 文件
  2. 壓縮 docx 文件,解壓縮它並遍歷所有 xml 文件以找到
    哈希碼並比較哈希碼。(建議作為答案)

“2”很好,但它需要大量迭代,解壓縮會創建很多文件夾。

"1" ,是直接的,因為我嘗試使用外部 lib -> docx4j ,它將 docx 轉換為 xml 然后我可以匹配哈希碼,它起作用了。

將 DOCX 轉換為 XML 文件

我不得不嘗試不同的選項,因為我正在尋找最簡單而不那么復雜的方法來比較 word 文檔的內容和樣式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM