RadDocument - programatically add watermark to MS Word document

10 posts, 0 answers
  1. C
    C avatar
    43 posts
    Member since:
    Jul 2014

    Posted 01 Jul 2014 Link to this post

    How would I programmatically add a text watermark to a Word document?

    We are using C#, .NET 4.5 for a WPF desktop application on Windows 7.  Telerik UI for WPF version 2014.2.617.45 is used.

    This needs to
    1. Create a new word document
    2. Add several pages of text, tables and images to the word document
    3. Add a user entered watermark such as "For Internal Use Only" to each page at 44 point and angled from bottom left to top right.
    4. The watermark should appear on all pages
    5. Save the document in MS Word 2010 format if possible

    It needs to be done in C# since there is no RichTextBox control in the application.


  2. Petya
    Admin
    Petya avatar
    975 posts

    Posted 03 Jul 2014 Link to this post

    Hi,

    It is possible to apply a watermark through code either using RadRichTextBox's API or a RadDocumentEditor instance. This article demonstrates how to apply a watermark using RadRichTextBox and the below snippet demonstrates the use of RadDocumentEditor in the same scenario.
    RadDocumentEditor editor = new RadDocumentEditor(myDocument);
     
    WatermarkTextSettings textSettings = new WatermarkTextSettings();
    textSettings.Text = "For Internal Use Only";
    textSettings.RotateAngle = 30;
    textSettings.Opacity = 1;
    textSettings.ForegroundColor = Colors.Gray;
     
    DocumentWatermarkSettings settings = new DocumentWatermarkSettings() { Type=WatermarkType.TextWatermark };
    settings.TextSettings = textSettings;
     
    editor.SetWatermark(settings);

    As to exporting to DOCX, here you can learn how you can use the format providers that come out of the box with the control. In this case you should use the DocxFormatProvider class.

    I hope this is helpful.

    Regards,
    Petya
    Telerik
     
    Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
     
  3. UI for WPF is Visual Studio 2017 Ready
  4. C
    C avatar
    43 posts
    Member since:
    Jul 2014

    Posted 03 Jul 2014 in reply to Petya Link to this post

    Thank you for the information.

    When adding the watermark before adding the first section, it adds a section break/blank page before the first page with text content.
    It works OK when you do the following
     1) add the first page of the document (text, images, etc.),
      2) add the watermark
      3) add the second page, third page, ...
      4) Export to word

    One thing that is confusing is how to switch between adding content text spans and paragraphs to the document  using  Document.Sections.Add() and using a RadDocumentEditor object.

    Here is a simplified version of it.  How can we achieve the simple step 2 for text color, size?

    1. Create RadDocument, RadDocumentEditor, paper size, margin and page orientation
            RadDocument doc = new RadDocument()
            RadDocumentEditor ed = new RadDocumentEditor(doc)
            doc.SectionDefauiltPageSize = PaperTypeConverter.ToSize(PaperTypes.Letter);
            doc.SectionDefauiltPageOrientation = PageOrientation.Portrait;
    2.  Create document body
             Insert "ABC" in Calibri 8 point red text followedeby a line break
             Insert "DEF" in Arial 12 point blue text - bold followed by a line break
             Insert "GHI" in Calibri 12 point black italic text followed by a line break
    3. Export to Word docx file
       using (Stream outStream = new FileStream("outputFile.docx", FileMode.Create))
       {
         DocxFormatProvider provider = new DocxFormatProvider();
         provider.Export(document, outStream);
       }
     
  5. C
    C avatar
    43 posts
    Member since:
    Jul 2014

    Posted 03 Jul 2014 in reply to C Link to this post

    Clarified question:
       How can we achieve the simple step 2 using a RadDocumentEditor for text color, size?


  6. Petya
    Admin
    Petya avatar
    975 posts

    Posted 07 Jul 2014 Link to this post

    Hello,

    The Document.Sections.Add(), Block.Inlines.Add(), etc. method are intended for non-measured documents. As opposed to that, the Insert~() methods are intended for measured documents (usually, but not exclusively shown in RadRichTextBox). Basically, when creating a document from code you should choose one of the approaches - either build it with the collections or use the methods of the editor, and stick to it. The behavior you explained seems to be caused by mixing the two approaches.

    My previous reply shows how to apply a watermark through RadDocumentEditor. In case you are having troubles with this please provide more information on the matter.

    Regards,
    Petya
    Telerik
     
    Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
     
  7. C
    C avatar
    43 posts
    Member since:
    Jul 2014

    Posted 07 Jul 2014 in reply to Petya Link to this post

    Thank  you for the response.

    Q1: Is it possible to add a watermark without using the RadDocumentEditor?   Something like document.SetWatermark( DocumentWatermarkSettings wmk) would be helpful.

    We're generating the Word docx document offline without a RichTextBox control.  Each page of the word document is generated in sequential order; this is generating a software execution report combined of about 10 sections with a mix of text, tables, images/graphs, etc.  It has a header, footer and a watermark.

    So far, only the table of contents field and watermark appear to need a RadDocumentEditor.

    This could follow three tracks in RichTextBox and RadDocument functionality:
      1. Visible RichTextBox with interactive user editing and programmatically changing text (e.g, button click to change font bold style)
               1a. Document defined largely in XAML
                1b. Document created in C# code
      2. Offline generation of a Word document without a RichTextBox.  Doing so without a RadDocumentEditor would help
      3. Modifying an existing document. 
               3a. Read in the document, insert new section, insert table, write back out.  
               3b. File conversion, convert from one doucment type to another in C# code

  8. Petya
    Admin
    Petya avatar
    975 posts

    Posted 10 Jul 2014 Link to this post

    Hello,

    Watermarks are properties of a section's header and it is possible to set them without a document editor.
    WatermarkTextSettings textSettings = new WatermarkTextSettings();
    textSettings.Text = "For Internal Use Only";
    textSettings.RotateAngle = 30;
    textSettings.Opacity = 1;
    textSettings.ForegroundColor = Colors.Gray;
     
    DocumentWatermarkSettings settings = new DocumentWatermarkSettings() { Type = WatermarkType.TextWatermark };
    settings.TextSettings = textSettings;
     
    Section s = new Section();
    s.Headers.Default.Body = new RadDocument();
    s.Headers.Default.WatermarkSettings = settings;

    Please note that in this case the document you add the section to should be in its non-measured state.

    When it comes to fields, some of them, especially the more complex ones like TableOfContentsField, can only be evaluated properly in a measured document which is why there is no straightforward way to add them without using the InsertField() method of a document editor.

    Regards,
    Petya
    Telerik
     
    Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
     
  9. C
    C avatar
    43 posts
    Member since:
    Jul 2014

    Posted 10 Jul 2014 in reply to Petya Link to this post

    Please add this to the help for the WaterMarkTextSettings() object.   These code examples will greatly help out developers.

    A watermark may be added to the section header as follows.

    WatermarkTextSettings textSettings = new WatermarkTextSettings();
    textSettings.Text = "For Internal Use Only";
    textSettings.RotateAngle = 30;
    textSettings.Opacity = 1;
    textSettings.ForegroundColor = Colors.Gray; 
    DocumentWatermarkSettings settings = new DocumentWatermarkSettings()  { Type = WatermarkType.TextWatermark };
    settings.TextSettings = textSettings; 
    Section s = new Section();
    s.Headers.Default.Body = new RadDocument();
    s.Headers.Default.WatermarkSettings = settings;
  10. C
    C avatar
    43 posts
    Member since:
    Jul 2014

    Posted 01 Oct 2014 in reply to C Link to this post

    Please consider a small API change to let the watermark be set on the section and not on the Headers.  
    Word uses the headers but this is misleading as the watermark applies to the section.

    This apparently is far too obscured in the Word object model documentation to be easily found.
  11. Petya
    Admin
    Petya avatar
    975 posts

    Posted 06 Oct 2014 Link to this post

    Hello,

    Thank you for the suggestion. At this point we are not considering the implementation of this change in the API.

    RadRichTextBox's document model allows to apply different headers/footers to the first and latter pages of a section and since watermarks are preserved in the header, this practically means you can set a different watermark for the first page of each section. Since this is the behavior according to the DOCX specification, and as you pointed out the behavior in other editors such as MS Word, we are not planning a change.

    Regards,
    Petya
    Telerik
     
    Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
     
Back to Top
UI for WPF is Visual Studio 2017 Ready