Compare dois documentos em Java
Tenho dois documentos do Word que estou tentando comparar em java. Tentei usar
código hash md5
HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());
e também usando,
boolean isEqual = FileUtils.contentEquals (oldFile, newFile);
Mesmo que o conteúdo seja o mesmo, compare o conteúdo usando ferramentas online e sem comparação, ainda assim o hashcode em ambos os métodos acima vem como MISMATCH.
alguma solução? ou uma forma de comparar qualquer tipo de arquivo usando qualquer API em Java. Eu preciso fazer uma comparação profunda entre dois arquivos de palavras para espaços, fontes, conteúdo. etc ..
Resultado esperado: ambos os arquivos devem corresponder
Respostas
Mesmo se os dois documentos tiverem a mesma aparência ou mesmo se ambos contiverem o mesmo conteúdo formatado, uma pequena alteração como a data da última modificação resultará em uma comparação falhada. Os documentos JSON são mais fáceis de comparar, mas os documentos do Word são binários. A menor alteração pode alterar o documento completamente.
Portanto, você tem que fazer isso da maneira mais difícil: Encontre uma biblioteca para ler o conteúdo dos arquivos do Word você mesmo e verifique o conteúdo de ambos os arquivos especificamente.
Houve várias sugestões e respostas à minha pergunta, obrigado por isso. As razões para incompatibilidade no arquivo docx estão nas informações de metadados, toda vez que criamos um arquivo doc / docx, o carimbo de data / hora muda. Embora eu tenha tentado alterar o carimbo de data / hora (acessado, modificado e criado) de ambos os arquivos para torná-lo o mesmo e comparar, o que não funcionou. O motivo é além desses carimbos de data / hora, há uma meta informação chamada Data de modificação do Zip, que não é visível quando vemos as propriedades do arquivo. este carimbo de data / hora que encontrei como um dos motivos da incompatibilidade no código de hash. Além disso, as strings codificadas em base64 eram diferentes por causa do carimbo de data / hora zip.
Então, as opções que tive de fazer a comparação foram:
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" era bom, mas exigia muitas iterações e a descompactação criaria muitas pastas.
"1", foi direto para fwd, pois tentei usando lib externo -> docx4j, que converteu o docx para xml e então consegui combinar o hashcode, funcionou.
Converter arquivo DOCX em XML
Tive que tentar opções diferentes, pois estava procurando uma maneira mais simples e não tão complexa de comparar o conteúdo e os estilos do documento do Word.