اسناد را مقایسه کنید
مقایسه اسناد فرایندی است که تغییرات بین دو سند را شناسایی می کند و شامل تغییرات به عنوان بازنگری است. این فرآیند هر دو سند را مقایسه می کند، از جمله نسخه های یک سند خاص، سپس تغییرات بین هر دو سند به عنوان بازنگری در سند اول نشان داده می شود.
روش مقایسه با مقایسه کلمات در سطح کاراکتر یا سطح کلمه حاصل می شود. اگر یک کلمه شامل تغییر حداقل یک کاراکتر باشد، در نتیجه، تفاوت به عنوان تغییر کل کلمه نمایش داده می شود، نه یک کاراکتر. این روند مقایسه یک کار معمول در صنایع حقوقی و مالی است.
به جای جستجوی دستی برای تفاوت بین اسناد یا بین نسخه های مختلف آنها، می توانید از Aspose.Words برای مقایسه اسناد و دریافت تغییرات محتوا در قالب بندی، سر و پای صفحه، جداول و موارد دیگر استفاده کنید.
این مقاله توضیح می دهد که چگونه اسناد را مقایسه کنیم و چگونه ویژگی های مقایسه پیشرفته را مشخص کنیم.
سعی کنید آنلاین
شما می توانید دو سند را با استفاده از مقایسه اسناد آنلاین ابزار.
توجه داشته باشید که روش مقایسه، که در زیر شرح داده شده است، در این ابزار برای اطمینان از دستیابی به نتایج برابر استفاده می شود. بنابراین شما حتی با استفاده از ابزار مقایسه آنلاین یا با استفاده از روش مقایسه در 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"); |