השוואת מסמכים

השוואת מסמכים היא תהליך שמזהה שינויים בין שני מסמכים ומכיל את השינויים כתיקונים. תהליך זה משווה בין שני מסמכים, כולל גרסאות של מסמך ספציפי אחד, ואז השינויים בין שני המסמכים יוצגו כתיקונים במסמך הראשון.

שיטת ההשוואה מושגת על ידי השוואת מילים ברמת התו או ברמת המילה. אם מילה מכילה שינוי של תו אחד לפחות, בתוצאה, ההבדל יוצג כשינוי של המילה כולה, לא תו. תהליך השוואה זה הוא משימה רגילה בענפים המשפטיים והפיננסיים.

במקום לחפש באופן ידני הבדלים בין מסמכים או בין גרסאות שונות שלהם, אתה יכול להשתמש Aspose.Words להשוואת מסמכים ולקבל שינויים בתוכן בעיצוב, כותרת עליונה/תחתונה, טבלאות ועוד.

מאמר זה מסביר כיצד להשוות מסמכים וכיצד לציין מאפייני השוואה מתקדמים.

מגבלות ותבניות קבצים נתמכות

השוואת מסמכים היא תכונה מורכבת מאוד. ישנם חלקים מגוונים של שילוב תוכן שצריך לנתח כדי לזהות את כל ההבדלים. הסיבה למורכבות זו נובעת מהעובדה ש Aspose.Words שואף להשיג את אותן תוצאות השוואה כמו אלגוריתם ההשוואה Microsoft Word.

המגבלה הכללית לשני מסמכים שנשווים היא שאסור להם לבצע שינויים לפני שהם קוראים לשיטת ההשוואה, שכן המגבלה הזו קיימת ב - Microsoft Word.

השווה בין שני מסמכים

כאשר אתה משווה מסמכים, ההבדלים של המסמך האחרון מהראשון מופיעים כתיקונים לראשון. בעת שינוי מסמך, לכל עריכה תהיה גרסה משלה לאחר הפעלת שיטת ההשוואה.

Aspose.Words מאפשר לך לזהות הבדלי מסמכים באמצעות שיטת Compare - זה דומה לתכונה Microsoft Word השוואת מסמכים. זה מאפשר לך לבדוק מסמכים או גרסאות מסמכים כדי למצוא הבדלים ושינויים, כולל שינויי עיצוב כגון שינויי גופן, שינויי ריווח, הוספת מילים ופסקאות.

כתוצאה מההשוואה, ניתן לקבוע מסמכים כשווים או לא שווים. המונח מסמכים “שווים” פירושו ששיטת ההשוואה אינה מסוגלת לייצג שינויים כתיקונים. המשמעות היא שגם טקסט המסמך וגם עיצוב הטקסט זהים. אבל יכולים להיות הבדלים אחרים בין מסמכים. לדוגמה, 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");