Comparar dos documentos en Java
Tengo dos documentos de Word que estoy tratando de comparar en Java. Intenté usar
código hash md5
HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());
y también usando,
booleano isEqual = FileUtils.contentEquals (archivo antiguo, archivo nuevo);
A pesar de que el contenido es el mismo, comparado con el contenido utilizando herramientas en línea y más allá de la comparación, el código hash en ambos métodos anteriores viene como MISMATCH.
alguna solución? o forma de comparar cualquier tipo de archivo usando cualquier API en Java. Necesito hacer una comparación profunda entre dos archivos de palabras como espacios, fuentes, contenido. etc ..
Resultado esperado: ambos archivos deben coincidir
Respuestas
Incluso si ambos documentos tienen el mismo aspecto o incluso si ambos contienen el mismo contenido formateado, un cambio leve como la fecha de la última modificación resultará en una comparación fallida. Los documentos JSON son más fáciles de comparar, pero los documentos de Word son binarios. El cambio más pequeño puede cambiar el documento por completo.
Por lo tanto, debe hacerlo de la manera difícil: busque una biblioteca para leer el contenido de los archivos de Word usted mismo y verifique el contenido de ambos archivos específicamente.
Hubo múltiples sugerencias y respuestas a mi pregunta, gracias por eso. Las razones de la falta de coincidencia en el archivo docx están en la información de metadatos, cada vez que creamos un archivo doc / docx, la marca de tiempo cambia. Aunque intenté cambiar la marca de tiempo (accedida, modificada y creada) de ambos archivos para hacerla igual y comparar, lo que no funcionó. La razón es que, aparte de estas marcas de tiempo, hay una metainformación llamada Zip Modify Date, que no es visible cuando vemos las propiedades del archivo. Esta marca de tiempo la encontré como una de las razones por las que no coincidía el código hash. Además, las cadenas codificadas en base64 eran diferentes debido a la marca de tiempo del zip.
Entonces, las opciones que tuve para hacer la comparación fueron:
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 bueno pero requería muchas iteraciones y descomprimirlo crearía muchas carpetas.
"1", fue directamente fwd, ya que lo probé usando lib externa -> docx4j, que convirtió el docx a xml y luego pude hacer coincidir el código hash, funcionó.
Convertir DOCX a archivo XML
Tuve que probar diferentes opciones ya que estaba buscando la forma más simple y no tan compleja de comparar el contenido y los estilos del documento de Word.