Sledování změn v dokumentu
Funkce sledování změn, známá také jako kontrola, vám umožňuje sledovat změny obsahu a formátování provedené vámi nebo jinými uživateli. Tato funkce změny stopy s Aspose.Words podporuje změny stopy v Microsoft Word. Pomocí této funkce můžete přistupovat k jednotlivým revizím v dokumentu a aplikovat na ně různé vlastnosti.
Když povolíte funkci sledování změn, všechny vložené, odstraněné a upravené prvky dokumentu budou vizuálně zvýrazněny informacemi o tom, kdo, kdy a co bylo změněno. Objekty, které nesou informace o tom, co bylo změněno, se nazývají “sledování změn”. Předpokládejme například, že chcete dokument zkontrolovat a provést důležité změny – to může znamenat, že je třeba provést revize. Možná budete muset také vložit komentáře, abyste diskutovali o některých změnách. To je místo, kde přichází sledování změn v dokumentech.
Tento článek vysvětluje, jak spravovat a sledovat změny vytvořené mnoha recenzenty ve stejném dokumentu, a také vlastnosti pro sledování změn.
Co je revize
Než se ponoříme do revizí, vysvětlíme význam revizí. revision je změna, ke které dochází v jednom uzlu dokumentu, zatímco skupina revizí, reprezentovaná třídou RevisionGroup, je skupina sekvenčních revizí, ke kterým dochází v mnoha uzlech dokumentu. Revize je v zásadě nástroj pro sledování změn.
Revize se používají ve funkci sledování změn a ve funkci porovnat dokumenty, kde se revize objeví jako výsledek srovnání. Revize v rámci funkce sledování změn tedy ukazují, kým a co bylo změněno.
Aspose.Words podporuje různé typy revizí, stejně jako v Microsoft Word, jako je vkládání, mazání, FormatChange, StyleDefinitionChange a přesouvání. Všechny typy revizí jsou reprezentovány výčtem RevisionType.
Spuštění a zastavení sledování změn
Úpravy dokumentu se obvykle nepočítají jako revize, dokud jej nezačnete sledovat. Aspose.Words umožňuje automaticky sledovat všechny změny v dokumentu pomocí jednoduchých kroků. Proces sledování změn můžete snadno spustit pomocí metody StartTrackRevisions. Pokud potřebujete zastavit proces sledování změn, aby se budoucí úpravy nepovažovaly za revize, budete muset použít metodu StopTrackRevisions.
StartTrackingRevisions
nemění stav vlastnosti TrackRevisions a nepoužívá její hodnotu pro cíl sledování revizí. Kromě toho, pokud byl uzel přesunut z jednoho místa do druhého uvnitř sledovaného dokumentu, budou vytvořeny revize přesunu, včetně rozsahu přesunu z a přesunu do.
Na konci procesu sledování změn v dokumentu budete mít možnost dokonce přijmout všechny revize nebo je odmítnout a vrátit dokument do původní podoby. Toho lze dosáhnout buď pomocí metody AcceptAllRevisions nebo RejectAll. Kromě toho můžete každou revizi přijmout nebo odmítnout samostatně pomocí metody Accept nebo Reject.
Všechny změny budou sledovány pro jednu iteraci od okamžiku, kdy proces zahájíte, do okamžiku, kdy jej zastavíte. Spojení mezi různými iteracemi je znázorněno jako následující scénář: dokončíte proces sledování, poté provedete některé změny a znovu začnete sledovat změny. V tomto scénáři se znovu zobrazí všechny změny, které jste nepřijali nebo neodmítli.
AcceptAllRevisions
je podobná metodě “přijmout všechny změny” v Microsoft Word.
Následující příklad kódu ukazuje, jak pracovat se sledováním změn:
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); |
Následující příklad kódu ukazuje, jak jsou generovány revize při přesunutí uzlu v rámci sledovaného dokumentu:
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); |
Správa a ukládání změn jako revizí
Pomocí předchozí funkce sledování změn můžete pochopit, které změny byly ve vašem dokumentu provedeny a kdo tyto změny provedl. Zatímco s funkcí TrackRevisions vynutíte, aby všechny změny v dokumentu byly uloženy jako revize.
Aspose.Words umožňuje zkontrolovat, zda má dokument revizi nebo ne, pomocí vlastnosti HasRevision. Pokud nepotřebujete automaticky sledovat změny v dokumentu pomocí metod StartTrackRevisions a StopTrackRevisions, můžete pomocí vlastnosti TrackRevisions
zkontrolovat, zda jsou změny sledovány při úpravách dokumentu v Microsoft Word a uloženy jako revize.
Funkce TrackRevisions
provádí revize namísto skutečných změn DOM. Samotné revize jsou však oddělené. Pokud například odstraníte jakýkoli odstavec, Aspose.Words jej vytvořte jako revizi a místo odstranění jej označte jako odstranění.
Aspose.Words navíc umožňuje zkontrolovat, zda byl objekt vložen, odstraněn nebo změněn formátováním pomocí IsDeleteRevision, IsFormatRevision, IsInsertRevision, IsMoveFromRevision, a IsMoveToRevision vlastnosti.
TrackRevisions
. Kromě toho můžete přijímat/odmítat revize bez ohledu na funkci sledování změn.
Následující příklad kódu ukazuje, jak použít různé vlastnosti s revizemi:
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()); |