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.
Çevrimiçi deneyin
Kullanarak iki belgeyi çevrimiçi olarak karşılaştırabilirsiniz Çevrimiçi belge karşılaştırması alet.
Aşağıda açıklanan karşılaştırma yönteminin, eşit sonuçların alınmasını sağlamak için bu araçta kullanıldığını unutmayın. Böylece, çevrimiçi karşılaştırma aracını kullanarak veya Aspose.Words içindeki karşılaştırma yöntemini kullanarak bile aynı sonuçları elde edersiniz.
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"); |