Comparați Documentele

Compararea documentelor este un proces care identifică modificările între două documente și conține modificările ca revizuiri. Acest proces compară oricare două documente, inclusiv versiunile unui document specific, apoi modificările dintre ambele documente vor fi afișate ca revizuiri în primul document.

Metoda de comparație se realizează prin compararea cuvintelor la nivel de caracter sau la nivel de cuvânt. Dacă un cuvânt conține o schimbare de cel puțin un caracter, în rezultat, diferența va fi afișată ca o schimbare a întregului cuvânt, nu un caracter. Acest proces de comparație este o sarcină obișnuită în industriile juridice și financiare.

În loc să căutați manual diferențele dintre documente sau între diferite versiuni ale acestora, puteți utiliza Aspose.Words pentru compararea documentelor și obținerea modificărilor de conținut în formatare, antet/subsol, tabele și multe altele.

Acest articol explică modul de comparare a documentelor și modul de specificare a proprietăților avansate de comparare.

Limitări și formate de fișiere acceptate

Compararea documentelor este o caracteristică foarte complexă. Există părți variate ale combinației de conținut care trebuie analizate pentru a recunoaște toate diferențele. Motivul acestei complexități se datorează faptului că Aspose.Words își propune să obțină aceleași rezultate de comparație ca algoritmul de comparație Microsoft Word.

Limitarea generală pentru două documente care sunt comparate este că acestea nu trebuie să aibă revizuiri înainte de a apela metoda de comparare, deoarece această limitare există în Microsoft Word.

Comparați Două Documente

Când comparați documente, diferențele dintre ultimul document și primul apar ca revizuiri ale primului. Când modificați un document, fiecare editare va avea propria revizuire după rularea metodei de comparare.

Aspose.Words vă permite să identificați diferențele de documente folosind metoda Compare - Aceasta este similară cu caracteristica de comparare a documentelor Microsoft Word. Vă permite să verificați documente sau versiuni de documente pentru a găsi diferențe și modificări, inclusiv modificări de formatare, cum ar fi modificări de font, modificări de spațiere, adăugarea de cuvinte și paragrafe.

Ca urmare a comparației, documentele pot fi determinate ca egale sau nu egale. Termenul de documente “egale” înseamnă că metoda de comparație nu este capabilă să reprezinte modificările ca revizuiri. Aceasta înseamnă că atât textul documentului, cât și formatarea textului sunt aceleași. Dar pot exista și alte diferențe între documente. De exemplu, Microsoft Word acceptă numai revizuiri de format pentru stiluri și nu puteți reprezenta inserarea/ștergerea stilului. Deci documentele pot avea un set diferit de stiluri, iar metoda Compare încă nu produce revizuiri.

Următorul exemplu de cod arată cum să verificați dacă două documente sunt egale sau nu:

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

Următorul exemplu de cod arată cum să aplicați pur și simplu metoda Compare la două documente:

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;

Specificați Opțiunile Avansate De Comparație

Există multe proprietăți diferite ale clasei CompareOptions pe care le puteți aplica atunci când doriți să comparați documente.

De exemplu, Aspose.Words vă permite să ignorați modificările efectuate în timpul unei operații de comparație pentru anumite tipuri de obiecte din documentul original. Puteți selecta proprietatea corespunzătoare pentru tipul de Obiect, cum ar fiIgnoreHeadersAndFooters, IgnoreFormatting, IgnoreComments, și altele prin setarea lor la “adevărat”.

În plus, Aspose.Words oferă proprietatea Granularity cu care puteți specifica dacă să urmăriți modificările după caracter sau după cuvânt.

O altă proprietate comună este alegerea documentului pentru a arăta modificările de comparație. De exemplu, caseta de dialog " comparați documentele “din Microsoft Word are opțiunea” Afișați modificările în " – aceasta afectează și rezultatele comparației. Aspose.Words oferă proprietatea Target care servește acestui scop.

Următorul exemplu de cod arată cum să setați proprietățile avansate de comparare:

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