Belgeleri Karşılaştır

Belgeleri karşılaştırmak, iki belge arasındaki değişiklikleri tanımlayan ve değişiklikleri düzeltme olarak içeren bir işlemdir. Bu işlem, belirli bir belgenin sürümleri de dahil olmak üzere iki belgeyi karşılaştırır, ardından her iki belge arasındaki değişiklikler ilk belgede revizyon olarak gösterilir.

Karşılaştırma yöntemi, kelimeleri karakter düzeyinde veya kelime düzeyinde karşılaştırarak elde edilir. Bir kelime en az bir karakterlik bir değişiklik içeriyorsa, sonuç olarak fark, bir karakter değil, tüm kelimenin bir değişikliği olarak görüntülenir. Bu karşılaştırma süreci, hukuk ve finans endüstrilerinde olağan bir görevdir.

Belgeler arasındaki veya bunların farklı sürümleri arasındaki farkları manuel olarak aramak yerine, belgeleri karşılaştırmak ve biçimlendirme, üstbilgi / altbilgi, tablolar ve daha fazlasında içerik değişiklikleri almak için Aspose.Words ‘ı kullanabilirsiniz.

Bu makalede, belgelerin nasıl karşılaştırılacağı ve gelişmiş karşılaştırma özelliklerinin nasıl belirtileceği açıklanmaktadır.

Sınırlamalar ve Desteklenen Dosya Biçimleri

Belgeleri karşılaştırmak çok karmaşık bir özelliktir. Tüm farklılıkları tanımak için analiz edilmesi gereken içerik kombinasyonunun çeşitli bölümleri vardır. Bu karmaşıklığın nedeni, Aspose.Words ‘in Microsoft Word karşılaştırma algoritması ile aynı karşılaştırma sonuçlarını elde etmeyi amaçlamasından kaynaklanmaktadır.

Karşılaştırılan iki belge için genel sınırlama, Microsoft Word ‘da bu sınırlama bulunduğundan, karşılaştırma yöntemini çağırmadan önce revizyonları olmaması gerektiğidir.

İki Belgeyi Karşılaştır

Belgeleri karşılaştırdığınızda, ikinci belgenin öncekinden farkları, öncekine yapılan düzeltmeler olarak görünür. Bir belgeyi değiştirdiğinizde, karşılaştırma yöntemini çalıştırdıktan sonra her düzenlemenin kendi revizyonu olacaktır.

Aspose.Words, Compare yöntemini kullanarak belge farklılıklarını tanımlamanıza olanak tanır - bu, Microsoft Word belge karşılaştırma özelliğine benzer. Yazı tipi değişiklikleri, aralık değişiklikleri, sözcük ve paragraf ekleme gibi biçimlendirme değişiklikleri de dahil olmak üzere farklılıkları ve değişiklikleri bulmak için belgeleri veya belge sürümlerini kontrol etmenizi sağlar.

Karşılaştırma sonucunda belgeler eşit veya eşit değil olarak belirlenebilir. “Eşit” belgeler terimi, karşılaştırma yönteminin değişiklikleri revizyon olarak gösteremediği anlamına gelir. Bu, hem belge metninin hem de metin biçimlendirmesinin aynı olduğu anlamına gelir. Ancak belgeler arasında başka farklılıklar da olabilir. Örneğin, Microsoft Word yalnızca stiller için biçim revizyonlarını destekler ve stil ekleme/silme işlemini temsil edemezsiniz. Bu nedenle, belgeler farklı bir stil kümesine sahip olabilir ve Compare yöntemi hala herhangi bir düzeltme üretmez.

Aşağıdaki kod örneği, iki belgenin eşit olup olmadığının nasıl kontrol edileceğini gösterir:

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;
}

Aşağıdaki kod örneği, Compare yönteminin iki belgeye nasıl uygulanacağını gösterir:

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;

Gelişmiş Karşılaştırma Seçeneklerini Belirtin

Belgeleri karşılaştırmak istediğinizde uygulayabileceğiniz CompareOptions sınıfının birçok farklı özelliği vardır.

Örneğin, Aspose.Words, orijinal belgedeki belirli nesne türleri için bir karşılaştırma işlemi sırasında yapılan değişiklikleri yok saymanıza olanak tanır. Nesne türü için uygun özelliği seçebilirsiniz, örneğin IgnoreHeadersAndFooters, IgnoreFormatting, IgnoreComments, ve diğerleri onları “doğru” olarak ayarlayarak.

Ayrıca Aspose.Words, değişiklikleri karaktere veya kelimeye göre izleyip izlemeyeceğinizi belirleyebileceğiniz Granularity özelliğini sağlar.

Diğer bir ortak özellik, karşılaştırma değişikliklerinin hangi belgede gösterileceği seçimidir. Örneğin, Microsoft Word ‘deki “Belgeleri karşılaştır iletişim kutusunda” “Değişiklikleri göster” seçeneği bulunur – bu, karşılaştırma sonuçlarını da etkiler. Aspose.Words bu amaca hizmet eden Target özelliğini sağlar.

Aşağıdaki kod örneği, gelişmiş karşılaştırma özelliklerinin nasıl ayarlanacağını gösterir:

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");