Запис на промените в документ

Функционалността на промените в коловозите, известни също като преглед, ви позволява да следите промените в съдържанието и форматирането, направени от вас или други потребители. Функция за промяна на песента с Aspose.Words поддържа промените в песента Microsoft Word. С тази функционалност можете да получите достъп до индивидуални ревизии във вашия документ и да приложите различни свойства към тях.

Когато активирате функцията за промяна на песента, всички вкарани, изтрити и променени елементи на документа ще бъдат визуално подчертани с информация за кого, кога и какво е променено. Обекти, които носят информация за това, което е било променено, се наричат “проследяващи промени.” Например, да предположим, че искате да прегледате документ и да направите важни промени, това може да означава, че трябва да направите ревизии. Също така, може да се наложи да вмъкнете коментари, за да обсъдите някои от промените. Тук идват промените в документите.

Тази статия обяснява как да се управляват и проследяват промените, създадени от много рецензенти на същия документ, както и свойствата за проследяване на промените.

Какво представлява преразглеждането

Преди да се потопиш в ревизии, нека да обясним значението на ревизиите. A revision е промяна, която настъпва в един възел на документ, докато група за преразглеждане, представена от RevisionGroup клас, е група последователни ревизии, които се появяват в много възли на документ. Ревизията е инструмент за проследяване на промените.

Преработките се използват в функцията за проследяване на промените и в рамките на функцията за сравнение на документите, когато ревизиите се появяват в резултат на сравнението. Така че ревизиите в функцията за проследяване на промените показват от кого и какво е променено.

Aspose.Words подкрепя различни видове преразглеждане, както и в Microsoft Word, като вмъкване, изтриване, формат Промяна, StyleDefinition Промяна и движение. Всички видове ревизия са представени с RevisionType Изброяване.

Начало и спиране на проследяването на промените

Редактирането на документ обикновено не се брои за ревизия, докато не започнете да го проследявате. Aspose.Words позволява автоматично проследяване на всички промени във вашия документ с прости стъпки. Можете лесно да започнете процеса на проследяване на промените с помощта на StartTrackRevisions метод. Ако трябва да спрете процеса на проследяване на промените, така че всички бъдещи редактирания да не се считат за ревизии, ще трябва да използвате StopTrackRevisions метод.

В края на процеса на проследяване на промените във вашия документ, ще имате възможността дори да приемете всички ревизии или да ги отхвърлите, за да върнете документа в първоначалния му вид. Това може да се постигне с помощта на AcceptAllRevisions или RejectAll метод. Освен това, можете да приемете или отхвърлите всяко преразглеждане отделно, като използвате Accept или Reject метод.

Всички промени ще бъдат проследени за една итерация от момента, в който започнете процеса до момента, в който го спрете. Връзката между различните итерация е представена като следния сценарий: завършвате процеса на проследяване, след това правите някои промени и отново започвате проследяване на промените. При този сценарий всички промени, които не сте приели или отхвърлили, ще бъдат показани отново.

Следният пример за код показва как да се работи с проследяване на промените:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
Body body = doc.getFirstSection().getBody();
Paragraph para = body.getFirstParagraph();
// Add text to the first paragraph, then add two more paragraphs.
para.appendChild(new Run(doc, "Paragraph 1. "));
body.appendParagraph("Paragraph 2. ");
body.appendParagraph("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("John Doe", new Date());
// This paragraph is a revision and will have the according "IsInsertRevision" flag set.
para = body.appendParagraph("Paragraph 4. ");
if(para.isInsertRevision())
System.out.println("isInsertRevision:" + para.isInsertRevision());
// Get the document's paragraph collection and remove a paragraph.
ParagraphCollection paragraphs = body.getParagraphs();
if(4 == paragraphs.getCount())
System.out.println("count:" + paragraphs.getCount());
para = paragraphs.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.
if(4 == paragraphs.getCount())
System.out.println("count:" + paragraphs.getCount());
if(para.isDeleteRevision())
System.out.println("isDeleteRevision:" + para.isDeleteRevision());
// The delete revision paragraph is removed once we accept changes.
doc.acceptAllRevisions();
if(3 == paragraphs.getCount())
System.out.println("count:" + paragraphs.getCount());
// Stopping the tracking of revisions makes this text appear as normal text.
// Revisions are not counted when the document is changed.
doc.stopTrackRevisions();
// Save the document.
doc.save(dataDir + "Document.Revisions.docx");

Следният пример за код показва как се генерират ревизии при преместване на възел в проследяван документ:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Generate document contents.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Paragraph 1");
builder.writeln("Paragraph 2");
builder.writeln("Paragraph 3");
builder.writeln("Paragraph 4");
builder.writeln("Paragraph 5");
builder.writeln("Paragraph 6");
Body body = doc.getFirstSection().getBody();
System.out.println("Paragraph count:" + body.getParagraphs().getCount());
// Start tracking revisions.
doc.startTrackRevisions("Author", new Date());
// Generate revisions when moving a node from one location to another.
Node node = body.getParagraphs().get(3);
Node endNode = body.getParagraphs().get(5).getNextSibling();
Node referenceNode = body.getParagraphs().get(0);
while (node != endNode)
{
Node nextNode = node.getNextSibling();
body.insertBefore(node, referenceNode);
node = nextNode;
}
// Stop the process of tracking revisions.
doc.stopTrackRevisions();
// There are 3 additional paragraphs in the move-from range.
System.out.println("Paragraph count: " + body.getParagraphs().getCount());
doc.save(dataDir + "out.docx");

Управление и магазин промени като ревизия

С предишната функция за проследяване на промените можете да разберете кои промени са направени във вашия документ и кой е направил тези промени. Докато с TrackRevisions функция, принуждавате всички промени в документа да се съхраняват като ревизии.

Aspose.Words позволява да проверите дали документът има ревизия или не чрез използване на HasRevision собственост. Ако не е необходимо автоматично да следите промените във вашия документ чрез StartTrackRevisions и StopTrackRevisions методи, тогава можете да използвате TrackRevisions имот за проверка дали промените са следени при редактиране на документ в Microsoft Word и се съхранява като ревизии.

На TrackRevisions функцията прави ревизии вместо истински DOM промени. Но самите ревизии са отделни. Например, Ако изтриете параграф, Aspose.Words Направете го като ревизия, маркирайте го като изтриване, вместо да го изтривате.

Освен това, Aspose.Words позволява да проверите дали даден обект е бил поставен, изтрит или променен форматиращ с помощта на IsDeleteRevision, IsFormatRevision, IsInsertRevision, IsMoveFromRevision, както и IsMoveToRevision имоти.

Следният пример за код показва как да се прилагат различни свойства с ревизии:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Open a blank document.
Document doc = new Document();
// Insert an inline shape without tracking revisions.
Shape shape = new Shape(doc, ShapeType.CUBE);
shape.setWrapType(WrapType.INLINE);
shape.setWidth(100.0);
shape.setHeight(100.0);
doc.getFirstSection().getBody().getFirstParagraph().appendChild(shape);
// Start tracking revisions and then insert another shape.
doc.startTrackRevisions("John Doe");
shape = new Shape(doc, ShapeType.SUN);
shape.setWrapType(WrapType.INLINE);
shape.setWidth(100.0);
shape.setHeight(100.0);
doc.getFirstSection().getBody().getFirstParagraph().appendChild(shape);
// Get the document's shape collection which includes just the two shapes we added.
Node[] shapes = doc.getChildNodes(NodeType.SHAPE, true).toArray();
if(2 == shapes.length)
System.out.println("Shapes Count:" + shapes.length);
// Remove the first shape.
shapes[0].remove();
Shape sh = (Shape) shapes[0];
// Because we removed that shape while changes were being tracked, the shape counts as a delete revision.
if(ShapeType.CUBE == sh.getShapeType())
System.out.println("Shape is CUBE");
if(sh.isDeleteRevision())
System.out.println("isDeleteRevision:" + sh.isDeleteRevision());
// And we inserted another shape while tracking changes, so that shape will count as an insert revision.
sh = (Shape) shapes[1];
if(ShapeType.SUN == sh.getShapeType())
System.out.println("Shape is SUN");
if(sh.isInsertRevision())
System.out.println("IsInsertRevision:" + sh.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 = new Document(dataDir + "Revision shape.docx");
Node[] nc = doc.getChildNodes(NodeType.SHAPE, true).toArray();
if(4 == nc.length)
System.out.println("Shapes Count:" + nc.length);
Shape mvr = (Shape) nc[0];
// This is the move to revision, also the shape at its arrival destination.
if(mvr.isMoveFromRevision())
System.out.println("isMoveFromRevision:" + mvr.isMoveFromRevision());
if(mvr.isMoveToRevision())
System.out.println("isMoveToRevision:" + mvr.isMoveToRevision());
mvr = (Shape) nc[1];
// This is the move from revision, which is the shape at its original location.
if(mvr.isMoveFromRevision())
System.out.println("isMoveFromRevision:" + mvr.isMoveFromRevision());
if(mvr.isMoveToRevision())
System.out.println("isMoveToRevision:" + mvr.isMoveToRevision());