Comparez deux documents en Java

Oct 16 2020

J'ai deux documents Word que j'essaye de comparer en java. J'ai essayé d'utiliser

hashcode md5

HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());

et aussi en utilisant,

booléen isEqual = FileUtils.contentEquals (oldFile, newFile);

Même si le contenu est le même, comparé au contenu à l'aide d'outils en ligne et au-delà de la comparaison, le hashcode dans les deux méthodes ci-dessus est toujours MISMATCH.

des solutions? ou moyen de comparer n'importe quel type de fichier en utilisant n'importe quelle API en Java. J'ai besoin de faire une comparaison approfondie entre deux fichiers de mots comme pour les espaces, les polices, le contenu. etc..

Résultat attendu: les deux fichiers doivent correspondre

Réponses

2 Milgo Oct 16 2020 at 12:41

Même si vos deux documents se ressemblent ou même si les deux contiennent le même contenu formaté, une légère modification comme la date de la dernière modification entraînera un échec de la comparaison. Les documents JSON sont plus faciles à comparer mais les documents Word sont binaires. Le moindre changement peut changer complètement le document.

Vous devez donc le faire à la dure: trouvez une bibliothèque pour lire le contenu des fichiers Word par vous-même et vérifiez spécifiquement le contenu des deux fichiers.

backToStack Oct 21 2020 at 16:38

Il y avait plusieurs suggestions et réponses à ma question, merci pour cela. Les raisons de la discordance dans le fichier docx sont là dans les informations de métadonnées, chaque fois que nous créons un fichier doc / docx, l'horodatage change. Bien que j'aie essayé de changer l'horodatage (consulté, modifié et créé) des deux fichiers pour le rendre identique et comparer, ce qui n'a pas fonctionné. La raison est qu'en dehors de ces horodatages, il existe une méta-info appelée Zip Modify Date, qui n'est pas visible lorsque nous voyons les propriétés du fichier. cet horodatage que j'ai trouvé comme l'une des raisons pour lesquelles il y avait une discordance dans le hashcode. En outre, les chaînes encodées en base64 étaient différentes en raison de l'horodatage zip.

Donc, les options que j'avais pour faire la comparaison étaient:

1. converting the docx file to xml file
2. Zip the docx file, unzip it and iterate though all the xml files to find  the hashcode and compare the hascodes.(suggeted as of the answers)

"2" était bon mais cela nécessitait beaucoup d'itérations et la décompression créerait beaucoup de dossiers.

"1", était directement fwd, comme je l'ai essayé en utilisant la lib externe -> docx4j, qui a converti le docx en xml et puis j'ai pu faire correspondre le hashcode, cela a fonctionné.

Convertir DOCX en fichier XML

J'ai dû essayer différentes options car je cherchais le moyen le plus simple et pas si complexe de comparer le contenu et les styles du document Word.