Проследяване на промени в документ
Функцията за проследяване на промени, известна също като преглед, ви позволява да проследявате промени в съдържанието и форматирането, направени от вас или други потребители. Тази функция за проследяване на промените с Aspose.Words поддържа проследяване на промените в Microsoft Word. С тази функционалност можете да получите достъп до отделни ревизии в документа си и да приложите различни свойства към тях.
Когато разрешите функцията за проследяване на промени, всички вмъкнати, изтрити и модифицирани елементи на документа ще бъдат визуално осветени с информация за това кой, кога и какво е променено. Обектите, които носят информация за това, което е променено, се наричат “проследяване на промените”. Да предположим например, че искате да прегледате документ и да направите важни промени – това може да означава, че трябва да направите корекции. Също така може да се наложи да вмъкнете коментари, за да обсъдите някои от промените. Това е мястото, където проследяването на промените в документите идва.
Тази статия обяснява как да управлявате и проследявате промени, създадени от много проверяващи в един и същ документ, както и свойствата за проследяване на промени.
Какво е ревизия
Преди да се потопим в ревизии, нека обясним значението на ревизиите. revision е промяна, която се случва в един възел на документ, докато група ревизии, представена от клас RevisionGroup, е група от последователни ревизии, които се случват в много възли на документ. Ревизията е инструмент за проследяване на промените.
Ревизиите се използват в функцията за проследяване на промени и в функцията за сравняване на документи, където ревизиите се появяват в резултат на сравнението. Така че ревизиите в функцията за проследяване на промените показват от кого и какво е променено.
Aspose.Words поддържа различни типове ревизии, както и в Microsoft Word, като Вмъкване, Изтриване, FormatChange, StyleDefinitionChange и преместване. Всички видове ревизии са представени с изброяването RevisionType.
Стартиране и спиране на проследяването на промените
Редактирането на документ обикновено не се счита за ревизия, докато не започнете да го проследявате. Aspose.Words позволява автоматично проследяване на всички промени във вашия документ с прости стъпки. Можете лесно да започнете процеса на проследяване на промените, като използвате метода StartTrackRevisions. Ако трябва да спрете процеса на проследяване на промените, така че всички бъдещи редакции да не се считат за ревизии, ще трябва да използвате метода StopTrackRevisions.
StartTrackingRevisions
не променя състоянието на свойството TrackRevisions и не използва неговата стойност за целите на проследяването на ревизиите. Освен това, ако даден възел е бил преместен от едно място на друго вътре в проследявания документ, ще бъдат създадени промени за преместване, включително преместване от и преместване в диапазон.
В края на процеса на проследяване на промените във вашия документ ще имате възможност дори да приемете всички ревизии или да ги отхвърлите, за да върнете документа в първоначалния му вид. Това може да се постигне чрез използване на AcceptAllRevisions или RejectAll Метод. Освен това можете да приемете или отхвърлите всяка редакция поотделно, като използвате метода Accept или Reject.
Всички промени ще бъдат проследени за една итерация от момента, в който започнете процеса, до момента, в който го спрете. Връзката между различните итерации е представена като следния сценарий: завършвате процеса на проследяване, след това правите някои промени и отново започвате да проследявате промените. При този сценарий всички промени, които не сте приели или отхвърлили, ще се покажат отново.
AcceptAllRevisions
е подобен на “приеми всички промени” в Microsoft Word.
Следният пример за код показва как да работите с проследяване на промени:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = System::MakeObject<Document>(); | |
System::SharedPtr<Body> body = doc->get_FirstSection()->get_Body(); | |
System::SharedPtr<Paragraph> para = body->get_FirstParagraph(); | |
// Add text to the first paragraph, then add two more paragraphs. | |
para->AppendChild(System::MakeObject<Run>(doc, u"Paragraph 1. ")); | |
body->AppendParagraph(u"Paragraph 2. "); | |
body->AppendParagraph(u"Paragraph 3. "); | |
// We have three paragraphs, none of which registered as any type of revision | |
// If we add/remove any content in the document while tracking revisions, | |
// they will be displayed as such in the document and can be accepted/rejected. | |
doc->StartTrackRevisions(u"John Doe", System::DateTime::get_Now()); | |
// This paragraph is a revision and will have the according "IsInsertRevision" flag set. | |
para = body->AppendParagraph(u"Paragraph 4. "); | |
ASSERT_TRUE(para->get_IsInsertRevision()); | |
// Get the document's paragraph collection and remove a paragraph. | |
System::SharedPtr<ParagraphCollection> paragraphs = body->get_Paragraphs(); | |
ASSERT_EQ(4, paragraphs->get_Count()); | |
para = paragraphs->idx_get(2); | |
para->Remove(); | |
// Since we are tracking revisions, the paragraph still exists in the document, will have the "IsDeleteRevision" set | |
// and will be displayed as a revision in Microsoft Word, until we accept or reject all revisions. | |
ASSERT_EQ(4, paragraphs->get_Count()); | |
ASSERT_TRUE(para->get_IsDeleteRevision()); | |
// The delete revision paragraph is removed once we accept changes. | |
doc->AcceptAllRevisions(); | |
ASSERT_EQ(3, paragraphs->get_Count()); | |
ASSERT_EQ(0, para->get_Count()); | |
// Stopping the tracking of revisions makes this text appear as normal text. | |
// Revisions are not counted when the document is changed. | |
doc->StopTrackRevisions(); | |
System::String outputPath = outputDataDir + u"WorkingWithRevisions.AcceptRevisions.doc"; | |
doc->Save(outputPath); |
Следващият пример за код показва как се генерират ревизии, когато възел се премества в проследяван документ:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = System::MakeObject<Document>(); | |
auto builder = System::MakeObject<DocumentBuilder>(doc); | |
builder->Writeln(u"Paragraph 1"); | |
builder->Writeln(u"Paragraph 2"); | |
builder->Writeln(u"Paragraph 3"); | |
builder->Writeln(u"Paragraph 4"); | |
builder->Writeln(u"Paragraph 5"); | |
builder->Writeln(u"Paragraph 6"); | |
System::SharedPtr<Body> body = doc->get_FirstSection()->get_Body(); | |
std::cout << "Paragraph count: " << body->get_Paragraphs()->get_Count() << std::endl; | |
// Start tracking revisions. | |
doc->StartTrackRevisions(u"Author", System::DateTime(2020, 12, 23, 14, 0, 0)); | |
// Generate revisions when moving a node from one location to another. | |
System::SharedPtr<Node> node = body->get_Paragraphs()->idx_get(3); | |
System::SharedPtr<Node> endNode = body->get_Paragraphs()->idx_get(5)->get_NextSibling(); | |
System::SharedPtr<Node> referenceNode = body->get_Paragraphs()->idx_get(0); | |
while (node != endNode) | |
{ | |
System::SharedPtr<Node> nextNode = node->get_NextSibling(); | |
body->InsertBefore(node, referenceNode); | |
node = nextNode; | |
} | |
// Stop the process of tracking revisions. | |
doc->StopTrackRevisions(); | |
// There are 3 additional paragraphs in the move-from range. | |
std::cout << "Paragraph count: " << body->get_Paragraphs()->get_Count() << std::endl; | |
System::String outputPath = outputDataDir + u"WorkingWithRevisions.MoveNodeInTrackedDocument.pdf"; | |
doc->Save(outputPath); |
Управление и съхраняване на промените като ревизии
С предишната функция за проследяване на промените можете да разберете кои промени са направени във вашия документ и кой е направил тези промени. Докато използвате функцията TrackRevisions, вие принуждавате всички промени във вашия документ да се съхраняват като ревизии.
Aspose.Words ви позволява да проверите дали даден документ има редакция или не, като използвате свойството HasRevision. Ако не е необходимо автоматично да проследявате промените в документа си чрез методите StartTrackRevisions и StopTrackRevisions, можете да използвате свойството TrackRevisions
, за да проверите дали промените се проследяват, докато редактирате документ в Microsoft Word и се съхраняват като корекции.
Функцията TrackRevisions
прави ревизии вместо реални DOM промени. Но самите ревизии са отделни. Например, ако изтриете някой абзац, Aspose.Words Направете го като ревизия, като го маркирате като изтриване, вместо да го изтриете.
В допълнение Aspose.Words ви позволява да проверите дали даден обект е вмъкнат, изтрит или променен форматиране с помощта на IsDeleteRevision, IsFormatRevision, IsInsertRevision, IsMoveFromRevision, и IsMoveToRevision свойства.
TrackRevisions
. Освен това можете да приемате/отхвърляте ревизии, независимо от функцията за проследяване на промените.
Следният пример за код показва как да прилагате различни свойства с ревизии:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
auto doc = System::MakeObject<Document>(); | |
// Insert an inline shape without tracking revisions. | |
ASSERT_FALSE(doc->get_TrackRevisions()); | |
auto shape = System::MakeObject<Shape>(doc, ShapeType::Cube); | |
shape->set_WrapType(WrapType::Inline); | |
shape->set_Width(100.0); | |
shape->set_Height(100.0); | |
doc->get_FirstSection()->get_Body()->get_FirstParagraph()->AppendChild(shape); | |
// Start tracking revisions and then insert another shape. | |
doc->StartTrackRevisions(u"John Doe"); | |
shape = System::MakeObject<Shape>(doc, ShapeType::Sun); | |
shape->set_WrapType(WrapType::Inline); | |
shape->set_Width(100.0); | |
shape->set_Height(100.0); | |
doc->get_FirstSection()->get_Body()->get_FirstParagraph()->AppendChild(shape); | |
// Get the document's shape collection which includes just the two shapes we added. | |
auto shapes = doc->GetChildNodes(NodeType::Shape, true)->LINQ_Cast<System::SharedPtr<Shape>>()->LINQ_ToList(); | |
ASSERT_EQ(2, shapes->get_Count()); | |
// Remove the first shape. | |
shapes->idx_get(0)->Remove(); | |
// Because we removed that shape while changes were being tracked, the shape counts as a delete revision. | |
ASSERT_EQ(ShapeType::Cube, shapes->idx_get(0)->get_ShapeType()); | |
ASSERT_TRUE(shapes->idx_get(0)->get_IsDeleteRevision()); | |
// And we inserted another shape while tracking changes, so that shape will count as an insert revision. | |
ASSERT_EQ(ShapeType::Sun, shapes->idx_get(1)->get_ShapeType()); | |
ASSERT_TRUE(shapes->idx_get(1)->get_IsInsertRevision()); | |
// The document has one shape that was moved, but shape move revisions will have two instances of that shape. | |
// One will be the shape at its arrival destination and the other will be the shape at its original location. | |
doc = System::MakeObject<Document>(inputDataDir + u"Revision shape.docx"); | |
shapes = doc->GetChildNodes(NodeType::Shape, true)->LINQ_Cast<System::SharedPtr<Shape>>()->LINQ_ToList(); | |
ASSERT_EQ(4, shapes->get_Count()); | |
// This is the move to revision, also the shape at its arrival destination. | |
ASSERT_FALSE(shapes->idx_get(0)->get_IsMoveFromRevision()); | |
ASSERT_TRUE(shapes->idx_get(0)->get_IsMoveToRevision()); | |
// This is the move from revision, which is the shape at its original location. | |
ASSERT_TRUE(shapes->idx_get(1)->get_IsMoveFromRevision()); | |
ASSERT_FALSE(shapes->idx_get(1)->get_IsMoveToRevision()); |