// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. /// <summary> /// Simple implementation of saving a document in the plain text format. Implemented as a Visitor. /// </summary> internal class ConvertDocToTxt : DocumentVisitor { public ConvertDocToTxt() { mIsSkipText = false; mBuilder = new StringBuilder(); } /// <summary> /// Gets the plain text of the document that was accumulated by the visitor. /// </summary> public string GetText() { return mBuilder.ToString(); } /// <summary> /// Called when a Run node is encountered in the document. /// </summary> public override VisitorAction VisitRun(Run run) { AppendText(run.Text); // Let the visitor continue visiting other nodes. return VisitorAction.Continue; } /// <summary> /// Called when a FieldStart node is encountered in the document. /// </summary> public override VisitorAction VisitFieldStart(FieldStart fieldStart) { // In Microsoft Word, a field code (such as "MERGEFIELD FieldName") follows // after a field start character. We want to skip field codes and output field. // Result only, therefore we use a flag to suspend the output while inside a field code. // Note this is a very simplistic implementation and will not work very well. // If you have nested fields in a document. mIsSkipText = true; return VisitorAction.Continue; } /// <summary> /// Called when a FieldSeparator node is encountered in the document. /// </summary> public override VisitorAction VisitFieldSeparator(FieldSeparator fieldSeparator) { // Once reached a field separator node, we enable the output because we are // now entering the field result nodes. mIsSkipText = false; return VisitorAction.Continue; } /// <summary> /// Called when a FieldEnd node is encountered in the document. /// </summary> public override VisitorAction VisitFieldEnd(FieldEnd fieldEnd) { // Make sure we enable the output when reached a field end because some fields // do not have field separator and do not have field result. mIsSkipText = false; return VisitorAction.Continue; } /// <summary> /// Called when visiting of a Paragraph node is ended in the document. /// </summary> public override VisitorAction VisitParagraphEnd(Paragraph paragraph) { // When outputting to plain text we output Cr+Lf characters. AppendText(ControlChar.CrLf); return VisitorAction.Continue; } public override VisitorAction VisitBodyStart(Body body) { // We can detect beginning and end of all composite nodes such as Section, Body, // Table, Paragraph etc and provide custom handling for them. mBuilder.Append("*** Body Started ***\r\n"); return VisitorAction.Continue; } public override VisitorAction VisitBodyEnd(Body body) { mBuilder.Append("*** Body Ended ***\r\n"); return VisitorAction.Continue; } /// <summary> /// Called when a HeaderFooter node is encountered in the document. /// </summary> public override VisitorAction VisitHeaderFooterStart(HeaderFooter headerFooter) { // Returning this value from a visitor method causes visiting of this // Node to stop and move on to visiting the next sibling node // The net effect in this example is that the text of headers and footers // Is not included in the resulting output return VisitorAction.SkipThisNode; } /// <summary> /// Adds text to the current output. Honors the enabled/disabled output flag. /// </summary> private void AppendText(string text) { if (!mIsSkipText) mBuilder.Append(text); } private readonly StringBuilder mBuilder; private bool mIsSkipText; }