Документи

Порівняти документи – це процес, який визначає зміни між двома документами та містить зміни у вигляді джерел. Цей процес порівнює будь-які два документи, включаючи версії одного конкретного документа, після чого зміни між документами будуть показані як ревізії у першому документі.

Метод порівняння досягається шляхом порівняння слів на рівні персонажа або на рівні слово. Якщо слово містить зміну принаймні одного персонажа, в результаті різниця буде відображатися як зміна всього слова, а не символу. Цей процес порівняння є звичайним завданням в юридичній та фінансовій галузі.

Замість ручного пошуку відмінностей між документами або між різними версіями їх можна використовувати Aspose.Words для порівняння документів та отримання змін вмісту у форматі, заголовок/ножиці, таблиці тощо.

Ця стаття пояснює, як порівняти документи і як визначити розширені властивості порівняння.

Обмеження та підтримка форматів файлів

Порівняти документи є дуже складною рисою. Розрізняються різні частини комбінації контенту, які потрібно аналізувати для розпізнавання всіх відмінностей. Причина такої складності полягає в тому, що Aspose.Words мета, щоб отримати однакові результати порівняння, як Microsoft Word алгоритм порівняння.

Загальна обмеження для двох документів у порівнянні з тим, що вони не повинні мати редакцій перед викликом методу порівняння, оскільки це обмеження існує в Microsoft Wordй

Порівняйте два документи

При порівнянні документів, відмінностей останнього документа від колишнього показаного доопрацювання. Коли ви змінюєте документ, кожен редагування буде мати власний ревізій після запуску методу порівняння.

Aspose.Words дозволяє визначити відмінності документів за допомогою Compare метод – це схоже на Microsoft Word Функція порівняння документів. Ви можете перевірити документи або документи для пошуку відмінностей і змін, в тому числі форматування модифікацій, таких як зміни шрифтів, зміни стрибків, додавання слів і абзаців.

В результаті порівняння можна визначити як рівні, так і не рівні. Термін “еквіальні” документи означає, що метод порівняння не здатний представляти зміни у вигляді ревізій. Це означає, що як текст документа, так і текстове форматування є однаковим. Але є інші відмінності між документами. Наприклад, Microsoft Word підтримує лише форматні версії для стилів, і ви не можете представляти вставку стилю / видалення. Отже, документи можуть мати різний набір стилів, і Compare метод ще не виробляє ревізій.

Приклад коду показує, як перевірити, чи є два документи рівні або не:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document docA = new Document(dataDir + "DocumentA.doc");
Document docB = new Document(dataDir + "DocumentB.doc");
docA.compare(docB, "user", new Date());
if (docA.getRevisions().getCount() == 0)
System.out.println("Documents are equal");
else
System.out.println("Documents are not equal");

Приклад коду показує, як просто застосувати Compare метод до двох документів:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The source document doc1
Document doc1 = new Document();
DocumentBuilder builder = new DocumentBuilder(doc1);
builder.writeln("This is the original document.");
// The target document doc2
Document doc2 = new Document();
builder = new DocumentBuilder(doc2);
builder.writeln("This is the edited document.");
// If either document has a revision, an exception will be thrown
if (doc1.getRevisions().getCount() == 0 && doc2.getRevisions().getCount() == 0)
doc1.compare(doc2, "authorName", new Date());
// If doc1 and doc2 are different, doc1 now has some revisions after the comparison, which can now be viewed and processed
if (doc1.getRevisions().getCount() == 2)
System.out.println("Documents are equal");
for (Revision r : doc1.getRevisions())
{
System.out.println("Revision type: " + r.getRevisionType() + ", on a node of type " + r.getParentNode().getNodeType() + "");
System.out.println("\tChanged text: " + r.getParentNode().getText() + "");
}
// All the revisions in doc1 are differences between doc1 and doc2, so accepting them on doc1 transforms doc1 into doc2
doc1.getRevisions().acceptAll();
// doc1, when saved, now resembles doc2
doc1.save(dataDir + "Document.Compare.docx");
doc1 = new Document(dataDir + "Document.Compare.docx");
if (doc1.getRevisions().getCount() == 0)
System.out.println("Documents are equal");
if (doc2.getText().trim() == doc1.getText().trim())
System.out.println("Documents are equal");

Вказати додаткові параметри порівняння

Є багато різних властивостей CompareOptions клас, який можна застосувати, коли потрібно порівнювати документи.

Наприклад, Aspose.Words дозволяє ігнорувати зміни, внесені під час операції порівняння для окремих типів об’єктів в оригінальному документі. Ви можете вибрати відповідне майно для типу об’єкта, такі як IgnoreHeadersAndFooters, IgnoreFormatting, IgnoreComments, і інші, встановивши їх до “true”.

Додатково Aspose.Words забезпечує Granularity майно, за допомогою якого можна вказати, чи слідкувати зміни за символом або словом.

Інша загальна властивість - це вибір, в якому документ, щоб показати зміни порівняння. Наприклад, діалогове вікно “Порівняти документи” Microsoft Word має опцію “Показати зміни” – це також впливає на результати порівняння. Aspose.Words забезпечує Target майно, яке виконує цю мету.

Приклад коду показує, як встановити розширені властивості порівняння:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Create the original document
Document docOriginal = new Document();
DocumentBuilder builder = new DocumentBuilder(docOriginal);
// Insert paragraph text with an endnote
builder.writeln("Hello world! This is the first paragraph.");
builder.insertFootnote(FootnoteType.ENDNOTE, "Original endnote text.");
// Insert a table
builder.startTable();
builder.insertCell();
builder.write("Original cell 1 text");
builder.insertCell();
builder.write("Original cell 2 text");
builder.endTable();
// Insert a textbox
Shape textBox = builder.insertShape(ShapeType.TEXT_BOX, 150, 20);
builder.moveTo(textBox.getFirstParagraph());
builder.write("Original textbox contents");
// Insert a DATE field
builder.moveTo(docOriginal.getFirstSection().getBody().appendParagraph(""));
builder.insertField(" DATE ");
// Insert a comment
Comment newComment = new Comment(docOriginal, "John Doe", "J.D.", new Date());
newComment.setText("Original comment.");
builder.getCurrentParagraph().appendChild(newComment);
// Insert a header
builder.moveToHeaderFooter(HeaderFooterType.HEADER_PRIMARY);
builder.writeln("Original header contents.");
// Create a clone of our document, which we will edit and later compare to the original
Document docEdited = (Document)docOriginal.deepClone(true);
Paragraph firstParagraph = docEdited.getFirstSection().getBody().getFirstParagraph();
// Change the formatting of the first paragraph, change casing of original characters and add text
firstParagraph.getRuns().get(0).setText("hello world! this is the first paragraph, after editing.");
firstParagraph.getParagraphFormat().setStyle(docEdited.getStyles().get(StyleIdentifier.HEADING_1));
// Edit the footnote
Footnote footnote = (Footnote)docEdited.getChild(NodeType.FOOTNOTE, 0, true);
footnote.getFirstParagraph().getRuns().get(1).setText("Edited endnote text.");
// Edit the table
Table table = (Table)docEdited.getChild(NodeType.TABLE, 0, true);
table.getFirstRow().getCells().get(1).getFirstParagraph().getRuns().get(0).setText("Edited Cell 2 contents");
// Edit the textbox
textBox = (Shape)docEdited.getChild(NodeType.SHAPE, 0, true);
textBox.getFirstParagraph().getRuns().get(0).setText("Edited textbox contents");
// Edit the DATE field
FieldDate fieldDate = (FieldDate)docEdited.getRange().getFields().get(0);
fieldDate.setUseLunarCalendar(true);
// Edit the comment
Comment comment = (Comment)docEdited.getChild(NodeType.COMMENT, 0, true);
comment.getFirstParagraph().getRuns().get(0).setText("Edited comment.");
// Edit the header
docEdited.getFirstSection().getHeadersFooters().getByHeaderFooterType(HeaderFooterType.HEADER_PRIMARY).getFirstParagraph().getRuns().get(0).setText("Edited header contents.");
// Apply different comparing options
CompareOptions compareOptions = new CompareOptions();
compareOptions.setIgnoreFormatting(false);
compareOptions.setIgnoreCaseChanges(false);
compareOptions.setIgnoreComments(false);
compareOptions.setIgnoreTables(false);
compareOptions.setIgnoreFields(false);
compareOptions.setIgnoreFootnotes(false);
compareOptions.setIgnoreTextboxes(false);
compareOptions.setIgnoreHeadersAndFooters(false);
compareOptions.setTarget(ComparisonTargetType.NEW);
// compare both documents
docOriginal.compare(docEdited, "John Doe", new Date(), compareOptions);
docOriginal.save(dataDir + "Document.CompareOptions.docx");