العمل مع التعليقات

Aspose.Words يسمح للمستخدمين بالعمل مع التعليقات-يتم تمثيل التعليقات في مستند في Aspose.Words بواسطة فئة Comment. استخدم أيضا الفئتين CommentRangeStart و CommentRangeEnd لتحديد منطقة النص التي يجب أن ترتبط بتعليق.

إضافة تعليق

Aspose.Words يسمح لك بإضافة التعليقات بعدة طرق:

  1. باستخدام فئة Comment
  2. باستخدام CommentRangeStart و CommentRangeEnd الطبقات

يوضح مثال التعليمات البرمجية التالية كيفية إضافة تعليق إلى فقرة باستخدام فئة Comment:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directory.
System::String outputDataDir = GetOutputDataDir_WorkingWithComments();
System::SharedPtr<Document> doc = System::MakeObject<Document>();
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
builder->Write(u"Some text is added.");
System::SharedPtr<Comment> comment = System::MakeObject<Comment>(doc, u"Awais Hafeez", u"AH", System::DateTime::get_Today());
builder->get_CurrentParagraph()->AppendChild(comment);
comment->get_Paragraphs()->Add(System::MakeObject<Paragraph>(doc));
comment->get_FirstParagraph()->get_Runs()->Add(System::MakeObject<Run>(doc, u"Comment text."));
System::String outputPath = outputDataDir + u"AddComments.doc";
// Save the document.
doc->Save(outputPath);

يوضح مثال التعليمة البرمجية التالية كيفية إضافة تعليق إلى فقرة باستخدام منطقة نص وفئات CommentRangeStart و CommentRangeEnd:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directory.
System::String outputDataDir = GetOutputDataDir_WorkingWithComments();
System::SharedPtr<Document> doc = System::MakeObject<Document>();
System::SharedPtr<Paragraph> para1 = System::MakeObject<Paragraph>(doc);
System::SharedPtr<Run> run1 = System::MakeObject<Run>(doc, u"Some ");
System::SharedPtr<Run> run2 = System::MakeObject<Run>(doc, u"text ");
para1->AppendChild(run1);
para1->AppendChild(run2);
doc->get_FirstSection()->get_Body()->AppendChild(para1);
System::SharedPtr<Paragraph> para2 = System::MakeObject<Paragraph>(doc);
System::SharedPtr<Run> run3 = System::MakeObject<Run>(doc, u"is ");
System::SharedPtr<Run> run4 = System::MakeObject<Run>(doc, u"added ");
para2->AppendChild(run3);
para2->AppendChild(run4);
doc->get_FirstSection()->get_Body()->AppendChild(para2);
System::SharedPtr<Comment> comment = System::MakeObject<Comment>(doc, u"Awais Hafeez", u"AH", System::DateTime::get_Today());
comment->get_Paragraphs()->Add(System::MakeObject<Paragraph>(doc));
comment->get_FirstParagraph()->get_Runs()->Add(System::MakeObject<Run>(doc, u"Comment text."));
System::SharedPtr<CommentRangeStart> commentRangeStart = System::MakeObject<CommentRangeStart>(doc, comment->get_Id());
System::SharedPtr<CommentRangeEnd> commentRangeEnd = System::MakeObject<CommentRangeEnd>(doc, comment->get_Id());
run1->get_ParentNode()->InsertAfter(commentRangeStart, run1);
run3->get_ParentNode()->InsertAfter(commentRangeEnd, run3);
commentRangeEnd->get_ParentNode()->InsertAfter(comment, commentRangeEnd);
System::String outputPath = outputDataDir + u"AnchorComment.doc";
// Save the document.
doc->Save(outputPath);

استخراج أو إزالة التعليقات

يعد استخدام التعليقات في مستند ورد (بالإضافة إلى تتبع التغييرات) ممارسة شائعة عند مراجعة المستندات، خاصة عندما يكون هناك العديد من المراجعين. يمكن أن تكون هناك مواقف يكون فيها الشيء الوحيد الذي تحتاجه من المستند هو التعليقات. لنفترض أنك تريد إنشاء قائمة بنتائج المراجعة، أو ربما تكون قد جمعت جميع المعلومات المفيدة من المستند وتريد ببساطة إزالة التعليقات غير الضرورية. قد ترغب في عرض أو إزالة تعليقات مراجع معين.

في هذه العينة، سنلقي نظرة على بعض الطرق البسيطة لجمع المعلومات من التعليقات داخل المستند ولإزالة التعليقات من المستند. على وجه التحديد، سنغطي كيفية:

  • استخراج جميع التعليقات من وثيقة أو فقط تلك التي أدلى بها مؤلف معين.
  • قم بإزالة جميع التعليقات من مستند أو من مؤلف معين فقط.

كيفية استخراج أو إزالة التعليقات

الكود في هذه العينة بسيط للغاية وتستند جميع الطرق إلى نفس النهج. يتم تمثيل التعليق في مستند ورد بكائن Comment في نموذج كائن المستند Aspose.Words. لجمع كل التعليقات في مستند، استخدم طريقة GetChildNodes مع تعيين المعلمة الأولى على NodeType.Comment. تأكد من تعيين المعلمة الثانية لطريقة GetChildNodes على صحيح: هذا يفرض GetChildNodes للاختيار من بين جميع العقد الفرعية بشكل متكرر، بدلا من جمع الأطفال المباشرين فقط.

لتوضيح كيفية استخراج التعليقات وإزالتها من مستند، سنتبع الخطوات التالية:

  1. افتح مستند ورد باستخدام فئة Document
  2. احصل على جميع التعليقات من المستند في مجموعة
  3. لاستخراج التعليقات:
    1. انتقل من خلال المجموعة باستخدام مشغل فوريش
    2. استخراج وقائمة اسم المؤلف والتاريخ والوقت ونص جميع التعليقات
    3. استخراج وقائمة اسم المؤلف والتاريخ والوقت ونص التعليقات التي كتبها مؤلف معين، في هذه الحالة، المؤلف ‘كس’
  4. لإزالة التعليقات:
    1. العودة إلى الوراء من خلال جمع باستخدام للمشغل
    2. إزالة التعليقات
  5. احفظ التغييرات

كيفية استخراج جميع التعليقات

طريقة GetChildNodes مفيدة للغاية ويمكنك استخدامها في كل مرة تحتاج فيها إلى الحصول على قائمة بعقد المستندات من أي نوع. لا تنشئ المجموعة الناتجة حملا فوريا لأن العقد يتم تحديدها في هذه المجموعة فقط عند تعداد العناصر الموجودة فيها أو الوصول إليها.

يوضح مثال الكود التالي كيفية استخراج اسم المؤلف والتاريخ والوقت ونص جميع التعليقات في المستند:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
std::vector<System::String> ExtractComments(const System::SharedPtr<Document>& doc)
{
std::vector<System::String> collectedComments;
// Collect all comments in the document
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true);
// Look through all comments and gather information about them.
for (System::SharedPtr<Comment> comment : System::IterateOver<System::SharedPtr<Comment>>(comments))
{
collectedComments.push_back(comment->get_Author() + u" " + comment->get_DateTime() + u" " + System::StaticCast<Node>(comment)->ToString(SaveFormat::Text));
}
return collectedComments;
}

كيفية استخراج تعليقات مؤلف محدد

بعد تحديد عقد التعليق في مجموعة، كل ما عليك فعله هو استخراج المعلومات التي تحتاجها. في هذه العينة، يتم دمج الأحرف الأولى للمؤلف والتاريخ والوقت والنص العادي للتعليق في سلسلة واحدة ؛ يمكنك اختيار تخزينه بطرق أخرى بدلا من ذلك.

الطريقة المثقلة التي تستخرج التعليقات من مؤلف معين هي نفسها تقريبا، فهي تتحقق فقط من اسم المؤلف قبل إضافة المعلومات إلى المصفوفة.

يوضح مثال الكود التالي كيفية استخراج اسم المؤلف والتاريخ والوقت ونص التعليقات من قبل المؤلف المحدد:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
std::vector<System::String> ExtractComments(const System::SharedPtr<Document>& doc, const System::String& authorName)
{
std::vector<System::String> collectedComments;
// Collect all comments in the document
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true);
// Look through all comments and gather information about those written by the authorName author.
for (System::SharedPtr<Comment> comment : System::IterateOver<System::SharedPtr<Comment>>(comments))
{
if (comment->get_Author() == authorName)
{
collectedComments.push_back(comment->get_Author() + u" " + comment->get_DateTime() + u" " + System::StaticCast<Node>(comment)->ToString(SaveFormat::Text));
}
}
return collectedComments;
}

كيفية إزالة التعليقات

إذا كنت تقوم بإزالة جميع التعليقات، فلا داعي للتنقل عبر المجموعة حذف التعليقات واحدا تلو الآخر ؛ يمكنك إزالتها عن طريق الاتصال NodeCollection.Clear في مجموعة التعليقات.

يوضح مثال التعليمات البرمجية التالية كيفية إزالة كافة التعليقات في المستند:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
void RemoveComments(const System::SharedPtr<Document>& doc)
{
// Collect all comments in the document
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true);
// Remove all comments.
comments->Clear();
}

عندما تحتاج إلى إزالة التعليقات بشكل انتقائي، تصبح العملية أكثر تشابها مع الكود الذي استخدمناه لاستخراج التعليقات.

يوضح مثال الكود التالي كيفية إزالة التعليقات من قبل المؤلف المحدد:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
void RemoveComments(const System::SharedPtr<Document>& doc, const System::String& authorName)
{
// Collect all comments in the document
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true);
// Look through all comments and remove those written by the authorName author.
for (int32_t i = comments->get_Count() - 1; i >= 0; i--)
{
System::SharedPtr<Comment> comment = System::DynamicCast<Comment>(comments->idx_get(i));
if (comment->get_Author() == authorName)
{
comment->Remove();
}
}
}

النقطة الرئيسية التي يجب تسليط الضوء عليها هنا هي استخدام المشغل. على عكس الاستخراج البسيط، هنا تريد حذف تعليق. الحيلة المناسبة هي تكرار المجموعة للخلف من التعليق الأخير إلى التعليق الأول. والسبب في ذلك إذا بدأت من النهاية وانتقلت للخلف، فسيظل فهرس العناصر السابقة دون تغيير، ويمكنك العودة إلى العنصر الأول في المجموعة.

يوضح مثال التعليمات البرمجية التالية طرق استخراج التعليقات وإزالتها:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_WorkingWithComments();
System::String outputDataDir = GetOutputDataDir_WorkingWithComments();
// Open the document.
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.doc");
// Extract the information about the comments of all the authors.
for (System::String const &comment : ExtractComments(doc))
{
std::cout << comment.ToUtf8String();
}
// Remove comments by the "pm" author.
RemoveComments(doc, u"pm");
std::cout << "Comments from \"pm\" are removed!" << std::endl;
// Extract the information about the comments of the "ks" author.
for (System::String const &comment: ExtractComments(doc, u"ks"))
{
std::cout << comment.ToUtf8String();
}
//Read the comment's reply and resolve them.
CommentResolvedandReplies(doc);
// Remove all comments.
RemoveComments(doc);
std::cout << "All comments are removed!" << std::endl;
System::String outputPath = outputDataDir + u"ProcessComments.doc";
// Save the document.
doc->Save(outputPath);

كيفية إزالة تعليق بين CommentRangeStart و CommentRangeEnd

باستخدام Aspose.Words يمكنك أيضا إزالة التعليقات بين العقدتين CommentRangeStart و CommentRangeEnd.

يوضح مثال الكود التالي كيفية إزالة النص بين CommentRangeStart و CommentRangeEnd:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_WorkingWithComments();
System::String outputDataDir = GetOutputDataDir_WorkingWithComments();
// Open the document.
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.doc");
System::SharedPtr<CommentRangeStart> commentStart = System::DynamicCast<CommentRangeStart>(doc->GetChild(NodeType::CommentRangeStart, 0, true));
System::SharedPtr<CommentRangeEnd> commentEnd = System::DynamicCast<CommentRangeEnd>(doc->GetChild(NodeType::CommentRangeEnd, 0, true));
System::SharedPtr<Node> currentNode = commentStart;
bool isRemoving = true;
while (currentNode != nullptr && isRemoving)
{
if (currentNode->get_NodeType() == NodeType::CommentRangeEnd)
{
isRemoving = false;
}
System::SharedPtr<Node> nextNode = currentNode->NextPreOrder(doc);
currentNode->Remove();
currentNode = nextNode;
}
System::String outputPath = outputDataDir + u"RemoveRegionText.doc";
// Save the document.
doc->Save(outputPath);

إضافة وإزالة رد التعليق

تضيف طريقة AddReply ردا على هذا التعليق. يرجى ملاحظة أنه نظرا لقيود المكتب الحالية Microsoft، يسمح فقط بمستوى 1 من الردود في المستند. سيتم رفع استثناء من النوع InvalidOperationException إذا تم استدعاء هذه الطريقة في تعليق الرد الحالي.

يمكنك استخدام طريقة RemoveReply لإزالة الرد المحدد على هذا التعليق.

يوضح مثال الكود التالي كيفية إضافة رد للتعليق وإزالة رد التعليق:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// The path to the documents directories.
System::String inputDataDir = GetInputDataDir_WorkingWithComments();
System::String outputDataDir = GetOutputDataDir_WorkingWithComments();
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"TestFile.doc");
System::SharedPtr<Comment> comment = System::DynamicCast<Comment>(doc->GetChild(NodeType::Comment, 0, true));
//Remove the reply
comment->RemoveReply(comment->get_Replies()->idx_get(0));
//Add a reply to comment
comment->AddReply(u"John Doe", u"JD", System::DateTime(2017, 9, 25, 12, 15, 0), u"New reply");
System::String outputPath = outputDataDir + u"CommentReply.doc";
// Save the document to disk.
doc->Save(outputPath);

اقرأ رد التعليق

تقوم الخاصية Replies بإرجاع مجموعة من الكائنات Comment التي تكون تابعة مباشرة للتعليق المحدد.

يوضح مثال الكود التالي كيفية التكرار من خلال ردود التعليق وحلها:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
void CommentResolvedandReplies(const System::SharedPtr<Document>& doc)
{
System::SharedPtr<NodeCollection> comments = doc->GetChildNodes(NodeType::Comment, true);
System::SharedPtr<Comment> parentComment = System::DynamicCast<Comment>(comments->idx_get(0));
for (System::SharedPtr<Comment> childComment : System::IterateOver<System::SharedPtr<Comment>>(parentComment->get_Replies()))
{
// Get comment parent and status.
std::cout << childComment->get_Ancestor()->get_Id() << std::endl << childComment->get_Done() << std::endl;
// And update comment Done mark.
childComment->set_Done(true);
}
}