Документи
Порівняти документи – це процес, який визначає зміни між двома документами та містить зміни у вигляді джерел. Цей процес порівнює будь-які два документи, включаючи версії одного конкретного документа, після чого зміни між документами будуть показані як ревізії у першому документі.
Метод порівняння досягається шляхом порівняння слів на рівні символів або на рівні слово. Якщо слово містить зміну принаймні одного персонажа, в результаті різниця буде відображатися як зміна всього слова, а не символу. Цей процес порівняння є звичайним завданням в юридичній та фінансовій галузі.
Замість ручного пошуку відмінностей між документами або між різними версіями їх можна використовувати Aspose.Words для порівняння документів та отримання змін вмісту у форматі, заголовок/фут, таблиці тощо.
Ця стаття пояснює, як порівняти документи і як визначити розширені властивості порівняння.
Почати онлайн
Ви можете порівняти два документи онлайн, використовуючи Порівняння документів онлайн інструмент.
Зверніть увагу, що метод порівняння, описаний нижче, використовується в цьому інструменті для забезпечення отримання рівних результатів. Таким чином, ви отримаєте однакові результати навіть за допомогою інструменту порівняння онлайн або за допомогою методу порівняння 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-.NET | |
Document docA = new Document(dataDir + "TestFile.doc"); | |
Document docB = new Document(dataDir + "TestFile - Copy.doc"); | |
// DocA now contains changes as revisions. | |
docA.Compare(docB, "user", DateTime.Now); | |
if (docA.Revisions.Count == 0) | |
Console.WriteLine("Documents are equal"); | |
else | |
Console.WriteLine("Documents are not equal"); |
Приклад наступного коду показує, як просто застосувати Compare
метод до двох документів:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// 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.Revisions.Count == 0 && doc2.Revisions.Count == 0) | |
doc1.Compare(doc2, "authorName", DateTime.Now); | |
// If doc1 and doc2 are different, doc1 now has some revisions after the comparison, which can now be viewed and processed. | |
Assert.AreEqual(2, doc1.Revisions.Count); | |
foreach (Revision r in doc1.Revisions) | |
{ | |
Console.WriteLine($"Revision type: {r.RevisionType}, on a node of type \"{r.ParentNode.NodeType}\""); | |
Console.WriteLine($"\tChanged text: \"{r.ParentNode.GetText()}\""); | |
} | |
// All the revisions in doc1 are differences between doc1 and doc2, so accepting them on doc1 transforms doc1 into doc2. | |
doc1.Revisions.AcceptAll(); | |
// doc1, when saved, now resembles doc2. | |
doc1.Save(dataDir + "Document.Compare.docx"); | |
doc1 = new Document(dataDir + "Document.Compare.docx"); | |
Assert.AreEqual(0, doc1.Revisions.Count); | |
Assert.AreEqual(doc2.GetText().Trim(), doc1.GetText().Trim()); |
Вказати додаткові параметри порівняння
Є багато різних властивостей 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-.NET | |
// 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.TextBox, 150, 20); | |
builder.MoveTo(textBox.FirstParagraph); | |
builder.Write("Original textbox contents"); | |
// Insert a DATE field. | |
builder.MoveTo(docOriginal.FirstSection.Body.AppendParagraph("")); | |
builder.InsertField(" DATE "); | |
// Insert a comment. | |
Comment newComment = new Comment(docOriginal, "John Doe", "J.D.", DateTime.Now); | |
newComment.SetText("Original comment."); | |
builder.CurrentParagraph.AppendChild(newComment); | |
// Insert a header. | |
builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary); | |
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.Clone(true); | |
Paragraph firstParagraph = docEdited.FirstSection.Body.FirstParagraph; | |
// Change the formatting of the first paragraph, change casing of original characters and add text. | |
firstParagraph.Runs[0].Text = "hello world! this is the first paragraph, after editing."; | |
firstParagraph.ParagraphFormat.Style = docEdited.Styles[StyleIdentifier.Heading1]; | |
// Edit the footnote. | |
Footnote footnote = (Footnote)docEdited.GetChild(NodeType.Footnote, 0, true); | |
footnote.FirstParagraph.Runs[1].Text = "Edited endnote text."; | |
// Edit the table. | |
Table table = (Table)docEdited.GetChild(NodeType.Table, 0, true); | |
table.FirstRow.Cells[1].FirstParagraph.Runs[0].Text = "Edited Cell 2 contents"; | |
// Edit the textbox. | |
textBox = (Shape)docEdited.GetChild(NodeType.Shape, 0, true); | |
textBox.FirstParagraph.Runs[0].Text = "Edited textbox contents"; | |
// Edit the DATE field. | |
FieldDate fieldDate = (FieldDate)docEdited.Range.Fields[0]; | |
fieldDate.UseLunarCalendar = true; | |
// Edit the comment. | |
Comment comment = (Comment)docEdited.GetChild(NodeType.Comment, 0, true); | |
comment.FirstParagraph.Runs[0].Text = "Edited comment."; | |
// Edit the header. | |
docEdited.FirstSection.HeadersFooters[HeaderFooterType.HeaderPrimary].FirstParagraph.Runs[0].Text = "Edited header contents."; | |
// Apply different comparing options. | |
CompareOptions compareOptions = new CompareOptions(); | |
compareOptions.IgnoreFormatting = false; | |
compareOptions.IgnoreCaseChanges = false; | |
compareOptions.IgnoreComments = false; | |
compareOptions.IgnoreTables = false; | |
compareOptions.IgnoreFields = false; | |
compareOptions.IgnoreFootnotes = false; | |
compareOptions.IgnoreTextboxes = false; | |
compareOptions.IgnoreHeadersAndFooters = false; | |
compareOptions.Target = ComparisonTargetType.New; | |
// compare both documents. | |
docOriginal.Compare(docEdited, "John Doe", DateTime.Now, compareOptions); | |
docOriginal.Save(dataDir + "Document.CompareOptions.docx"); | |
docOriginal = new Document(dataDir + "Document.CompareOptions.docx"); | |
// If you set compareOptions to ignore certain types of changes, | |
// then revisions done on those types of nodes will not appear in the output document. | |
// You can tell what kind of node a revision was done on by looking at the NodeType of the revision's parent nodes. | |
Assert.AreNotEqual(compareOptions.IgnoreFormatting, docOriginal.Revisions.Any(rev => rev.RevisionType == RevisionType.FormatChange)); | |
Assert.AreNotEqual(compareOptions.IgnoreCaseChanges, docOriginal.Revisions.Any(s => s.ParentNode.GetText().Contains("hello"))); | |
Assert.AreNotEqual(compareOptions.IgnoreComments, docOriginal.Revisions.Any(rev => HasParentOfType(rev, NodeType.Comment))); | |
Assert.AreNotEqual(compareOptions.IgnoreTables, docOriginal.Revisions.Any(rev => HasParentOfType(rev, NodeType.Table))); | |
Assert.AreNotEqual(compareOptions.IgnoreFields, docOriginal.Revisions.Any(rev => HasParentOfType(rev, NodeType.FieldStart))); | |
Assert.AreNotEqual(compareOptions.IgnoreFootnotes, docOriginal.Revisions.Any(rev => HasParentOfType(rev, NodeType.Footnote))); | |
Assert.AreNotEqual(compareOptions.IgnoreTextboxes, docOriginal.Revisions.Any(rev => HasParentOfType(rev, NodeType.Shape))); | |
Assert.AreNotEqual(compareOptions.IgnoreHeadersAndFooters, docOriginal.Revisions.Any(rev => HasParentOfType(rev, NodeType.HeaderFooter))); |