اسناد را مقایسه کنید

مقایسه اسناد فرایندی است که تغییرات بین دو سند را شناسایی می کند و شامل تغییرات به عنوان بازنگری است. این فرآیند هر دو سند را مقایسه می کند، از جمله نسخه های یک سند خاص، سپس تغییرات بین هر دو سند به عنوان بازنگری در سند اول نشان داده می شود.

روش مقایسه با مقایسه کلمات در سطح کاراکتر یا سطح کلمه حاصل می شود. اگر یک کلمه شامل تغییر حداقل یک کاراکتر باشد، در نتیجه، تفاوت به عنوان تغییر کل کلمه نمایش داده می شود، نه یک کاراکتر. این روند مقایسه یک کار معمول در صنایع حقوقی و مالی است.

به جای جستجوی دستی برای تفاوت بین اسناد یا بین نسخه های مختلف آنها، می توانید از Aspose.Words برای مقایسه اسناد و دریافت تغییرات محتوا در قالب بندی، سر و پای صفحه، جداول و موارد دیگر استفاده کنید.

این مقاله توضیح می دهد که چگونه اسناد را مقایسه کنیم و چگونه ویژگی های مقایسه پیشرفته را مشخص کنیم.

محدودیت ها و فرمت های فایل پشتیبانی شده

مقایسه اسناد یک ویژگی بسیار پیچیده است. بخش های مختلفی از ترکیب محتوا وجود دارد که باید برای تشخیص همه تفاوت ها تجزیه و تحلیل شوند. دلیل این پیچیدگی به این دلیل است که Aspose.Words هدف آن به دست آوردن همان نتایج مقایسه با الگوریتم مقایسه Microsoft Word است.

محدودیت کلی برای دو سند در حال مقایسه این است که آنها نباید قبل از فراخوانی روش مقایسه تجدید نظر داشته باشند زیرا این محدودیت در Microsoft Word وجود دارد.

مقایسه دو سند

وقتی اسناد را با هم مقایسه می کنید، تفاوت های سند دوم با سند قبلی به عنوان اصلاحات به سند قبلی ظاهر می شود. وقتی یک سند را تغییر می دهید، هر ویرایش پس از اجرای روش مقایسه، بازبینی خاص خود را خواهد داشت.

Aspose.Words به شما اجازه می دهد تا تفاوت اسناد را با استفاده از روش Compare شناسایی کنید – این شبیه به ویژگی Microsoft Word document compare است. این امکان را به شما می دهد تا اسناد یا نسخه های سند را بررسی کنید تا تفاوت ها و تغییرات را پیدا کنید، از جمله اصلاحات قالب بندی مانند تغییرات فونت، تغییرات فاصله، اضافه کردن کلمات و پاراگراف ها.

در نتیجه مقایسه، اسناد را می توان برابر یا غیر برابر تعیین کرد. اصطلاح “اسناد برابر” به این معنی است که روش مقایسه قادر به نشان دادن تغییرات به عنوان بازنگری نیست. این بدان معنی است که هر دو متن سند و قالب بندی متن یکسان هستند. اما می تواند تفاوت های دیگری بین اسناد وجود داشته باشد. به عنوان مثال، Microsoft Word فقط از اصلاحات فرمت برای سبک ها پشتیبانی می کند و شما نمی توانید درج/حذف سبک را نشان دهید. بنابراین اسناد می توانند مجموعه ای متفاوت از سبک ها داشته باشند، و روش Compare هنوز هیچ بازبینی تولید نمی کند.

مثال کد زیر نشان می دهد که چگونه دو سند برابر هستند یا نه:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<Document> docA = System::MakeObject<Document>(inputDataDir + u"TestFile.doc");
System::SharedPtr<Document> docB = System::MakeObject<Document>(inputDataDir + u"TestFile - Copy.doc");
// DocA now contains changes as revisions.
docA->Compare(docB, u"user", System::DateTime::get_Now());
if (docA->get_Revisions()->get_Count() == 0)
{
std::cout << "Documents are equal" << std::endl;
}
else
{
std::cout << "Documents are not equal" << std::endl;
}

مثال کد زیر نشان می دهد که چگونه به سادگی روش Compare را به دو سند اعمال کنیم:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The source document doc1
System::SharedPtr<Document> doc1 = System::MakeObject<Document>();
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc1);
builder->Writeln(u"This is the original document.");
// The target document doc2
System::SharedPtr<Document> doc2 = System::MakeObject<Document>();
builder = System::MakeObject<DocumentBuilder>(doc2);
builder->Writeln(u"This is the edited document.");
// If either document has a revision, an exception will be thrown
if (doc1->get_Revisions()->get_Count() == 0 && doc2->get_Revisions()->get_Count() == 0)
doc1->Compare(doc2, u"authorName", System::DateTime::get_Now());
// If doc1 and doc2 are different, doc1 now has some revisions after the comparison, which can now be viewed and processed
if (doc1->get_Revisions()->get_Count() == 2)
std::cout << "Documents are equal." << std::endl << std::endl;
for (System::SharedPtr<Revision> r : System::IterateOver(doc1->get_Revisions()))
{
std::cout << "Revision type: " << System::ObjectExt::ToString(r->get_RevisionType()).ToUtf8String()
<< ", on a node of type " << System::ObjectExt::ToString(r->get_ParentNode()->get_NodeType()).ToUtf8String() << std::endl;
std::cout << "Changed text: " << r->get_ParentNode()->GetText() << std::endl;
}
// All the revisions in doc1 are differences between doc1 and doc2, so accepting them on doc1 transforms doc1 into doc2
doc1->get_Revisions()->AcceptAll();
// doc1, when saved, now resembles doc2
doc1->Save(inputDataDir + u"Document.Compare.docx");
doc1 = System::MakeObject<Document>(inputDataDir + u"Document.Compare.docx");
if (doc1->get_Revisions()->get_Count() == 0)
std::cout << "Documents are equal" << std::endl;
if (doc2->GetText().Trim() == doc1->GetText().Trim())
std::cout << "Documents are equal" << std::endl;

گزینه های مقایسه پیشرفته را مشخص کنید

ویژگی های مختلفی از کلاس CompareOptions وجود دارد که می توانید هنگام مقایسه اسناد اعمال کنید.

به عنوان مثال، Aspose.Words به شما اجازه می دهد تا تغییرات ایجاد شده در طول یک عملیات مقایسه برای انواع خاصی از اشیاء در سند اصلی را نادیده بگیرید. شما می توانید ویژگی مناسب برای نوع شی را انتخاب کنید، مانند IgnoreHeadersAndFooters, IgnoreFormatting, IgnoreComments, و دیگران با قرار دادن آنها به “واقعی”.

علاوه بر این، 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-C
// Create the original document
System::SharedPtr<Document> docOriginal = System::MakeObject<Document>();
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(docOriginal);
// Insert paragraph text with an endnote
builder->Writeln(u"Hello world! This is the first paragraph.");
builder->InsertFootnote(FootnoteType::Endnote, u"Original endnote text.");
// Insert a table
builder->StartTable();
builder->InsertCell();
builder->Write(u"Original cell 1 text");
builder->InsertCell();
builder->Write(u"Original cell 2 text");
builder->EndTable();
// Insert a textbox
System::SharedPtr<Shape> textBox = builder->InsertShape(ShapeType::TextBox, 150, 20);
builder->MoveTo(textBox->get_FirstParagraph());
builder->Write(u"Original textbox contents");
// Insert a DATE field
builder->MoveTo(docOriginal->get_FirstSection()->get_Body()->AppendParagraph(u""));
builder->InsertField(u" DATE ");
// Insert a comment
auto newComment = System::MakeObject<Comment>(docOriginal, u"John Doe", u"J.D.", System::DateTime::get_Now());
newComment->SetText(u"Original comment.");
builder->get_CurrentParagraph()->AppendChild(newComment);
// Insert a header
builder->MoveToHeaderFooter(Aspose::Words::HeaderFooterType::HeaderPrimary);
builder->Writeln(u"Original header contents.");
// Create a clone of our document, which we will edit and later compare to the original
auto docEdited = System::DynamicCast<Aspose::Words::Document>(System::StaticCast<Node>(docOriginal)->Clone(true));
System::SharedPtr<Paragraph> firstParagraph = docEdited->get_FirstSection()->get_Body()->get_FirstParagraph();
// Change the formatting of the first paragraph, change casing of original characters and add text
firstParagraph->get_Runs()->idx_get(0)->set_Text(u"hello world! this is the first paragraph, after editing.");
firstParagraph->get_ParagraphFormat()->set_Style(docEdited->get_Styles()->idx_get(Aspose::Words::StyleIdentifier::Heading1));
// Edit the footnote
auto footnote = System::DynamicCast<Aspose::Words::Footnote>(docEdited->GetChild(Aspose::Words::NodeType::Footnote, 0, true));
footnote->get_FirstParagraph()->get_Runs()->idx_get(1)->set_Text(u"Edited endnote text.");
// Edit the table
auto table = System::DynamicCast<Aspose::Words::Tables::Table>(docEdited->GetChild(Aspose::Words::NodeType::Table, 0, true));
table->get_FirstRow()->get_Cells()->idx_get(1)->get_FirstParagraph()->get_Runs()->idx_get(0)->set_Text(u"Edited Cell 2 contents");
// Edit the textbox
textBox = System::DynamicCast<Aspose::Words::Drawing::Shape>(docEdited->GetChild(Aspose::Words::NodeType::Shape, 0, true));
textBox->get_FirstParagraph()->get_Runs()->idx_get(0)->set_Text(u"Edited textbox contents");
// Edit the DATE field
auto fieldDate = System::DynamicCast<Aspose::Words::Fields::FieldDate>(docEdited->get_Range()->get_Fields()->idx_get(0));
fieldDate->set_UseLunarCalendar(true);
// Edit the comment
auto comment = System::DynamicCast<Aspose::Words::Comment>(docEdited->GetChild(Aspose::Words::NodeType::Comment, 0, true));
comment->get_FirstParagraph()->get_Runs()->idx_get(0)->set_Text(u"Edited comment.");
// Edit the header
docEdited->get_FirstSection()->get_HeadersFooters()->idx_get(Aspose::Words::HeaderFooterType::HeaderPrimary)->get_FirstParagraph()->get_Runs()->idx_get(0)->set_Text(u"Edited header contents.");
// When we compare documents, the differences of the latter document from the former show up as revisions to the former
// Each edit that we've made above will have its own revision, after we run the Compare method
// We can compare with a CompareOptions object, which can suppress changes done to certain types of objects within the original document
// from registering as revisions after the comparison by setting some of these members to "true"
auto compareOptions = System::MakeObject<Aspose::Words::CompareOptions>();
compareOptions->set_IgnoreFormatting(false);
compareOptions->set_IgnoreCaseChanges(false);
compareOptions->set_IgnoreComments(false);
compareOptions->set_IgnoreTables(false);
compareOptions->set_IgnoreFields(false);
compareOptions->set_IgnoreFootnotes(false);
compareOptions->set_IgnoreTextboxes(false);
compareOptions->set_IgnoreHeadersAndFooters(false);
compareOptions->set_Target(Aspose::Words::ComparisonTargetType::New);
docOriginal->Compare(docEdited, u"John Doe", System::DateTime::get_Now(), compareOptions);
docOriginal->Save(inputDataDir + u"Document.CompareOptions.docx");