none
Generating a Custom Watermark with Open XML SDK

    Question

  • I have successfully added text watermarks to Word documents with Open XML SDK, but now want to add a custom watermark using an image as a background.

    I have created a simple document in Word 2007, saved it and then created another document with the original simple document having a custom watermark from a selected image.

    I then compared the two documents using the Open XML SDK 2.0 Productivity Tool, but found a bewildering number of differences and I am not clear where to start.

    What I had hoped to be able to do was to provide a C# method such as:

    public static void InsertCustomWatermark(WordprocessingDocument wordDocument, String customImagePath)

    I would be grateful for any help on this subject such as a reference to a 'How to' document.

     

     

     

     
    • Modifié AlanNHBC lundi 3 octobre 2011 14:30
    lundi 3 octobre 2011 14:08

Réponses

  • Hi AlanNHBC,

     

    Thanks for posting in the MSDN Forum.

     

    It’s seems that you want to insert a watermark into a current document file. Please take a look at this snippet, to see whether it can approach your goal.

     

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml;
    using V = DocumentFormat.OpenXml.Vml;
    using System.Diagnostics;
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                using (WordprocessingDocument package = WordprocessingDocument.Open(@"C:\Users\*****\****.docx", true))
                {
                    InsertCustomWatermark(package, @"C:\Users\*******\****.jpg");
                }
            }
    
            private void InsertCustomWatermark(WordprocessingDocument package, string p)
            {
                SetWaterMarkPicture(p);
                MainDocumentPart mainDocumentPart1 = package.MainDocumentPart;
                if (mainDocumentPart1 != null)
                {
                    mainDocumentPart1.DeleteParts(mainDocumentPart1.HeaderParts);
                    HeaderPart headPart1 = mainDocumentPart1.AddNewPart<HeaderPart>();
                    GenerateHeaderPart1Content(headPart1);
                    string rId = mainDocumentPart1.GetIdOfPart(headPart1);
                    ImagePart image = headPart1.AddNewPart<ImagePart>("image/jpeg", "rId999");
                    GenerateImagePart1Content(image);
                    IEnumerable<SectionProperties> sectPrs = mainDocumentPart1.Document.Body.Elements<SectionProperties>();
                    foreach (var sectPr in sectPrs)
                    {
                        sectPr.RemoveAllChildren<HeaderReference>();
                        sectPr.PrependChild<HeaderReference>(new HeaderReference() { Id = rId });
                    }
                }
                else
                {
                    MessageBox.Show("alert");
                }
            }
            private void GenerateHeaderPart1Content(HeaderPart headerPart1)
            {
                Header header1 = new Header();
                Paragraph paragraph2 = new Paragraph();
                Run run1 = new Run();
                Picture picture1 = new Picture();
                V.Shape shape1 = new V.Shape() { Id = "WordPictureWatermark75517470", Style = "position:absolute;left:0;text-align:left;margin-left:0;margin-top:0;width:415.2pt;height:456.15pt;z-index:-251656192;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin", OptionalString = "_x0000_s2051", AllowInCell = false, Type = "#_x0000_t75" };
                V.ImageData imageData1 = new V.ImageData() { Gain = "19661f", BlackLevel = "22938f", Title = "水印", RelationshipId = "rId999" };
                shape1.Append(imageData1);
                picture1.Append(shape1);
                run1.Append(picture1);
                paragraph2.Append(run1);
                header1.Append(paragraph2);
                headerPart1.Header = header1;
            }
            private void GenerateImagePart1Content(ImagePart imagePart1)
            {
                System.IO.Stream data = GetBinaryDataStream(imagePart1Data);
                imagePart1.FeedData(data);
                data.Close();
            }
            private string imagePart1Data = "";
            private System.IO.Stream GetBinaryDataStream(string base64String)
            {
                return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String));
            }
            public void SetWaterMarkPicture(string file)
            {
                FileStream inFile;
                byte[] byteArray;
                try
                {
                    inFile = new FileStream(file, FileMode.Open, FileAccess.Read);
                    byteArray = new byte[inFile.Length];
                    long byteRead = inFile.Read(byteArray, 0, (int)inFile.Length);
                    inFile.Close();
                    imagePart1Data = Convert.ToBase64String(byteArray, 0, byteArray.Length);
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.Message);
                }
            }
        }
    }
    

     

    If you still have any questions, please feel free to let me know.

     

    Have a good day,

     

    Tom

     

     

     


    Tom Xu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    mercredi 5 octobre 2011 06:24
    Modérateur

Toutes les réponses

  • Hi AlanNHBC,

     

    Thanks for posting in the MSDN Forum.

     

    It’s seems that you want to insert a watermark into a current document file. Please take a look at this snippet, to see whether it can approach your goal.

     

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml;
    using V = DocumentFormat.OpenXml.Vml;
    using System.Diagnostics;
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                using (WordprocessingDocument package = WordprocessingDocument.Open(@"C:\Users\*****\****.docx", true))
                {
                    InsertCustomWatermark(package, @"C:\Users\*******\****.jpg");
                }
            }
    
            private void InsertCustomWatermark(WordprocessingDocument package, string p)
            {
                SetWaterMarkPicture(p);
                MainDocumentPart mainDocumentPart1 = package.MainDocumentPart;
                if (mainDocumentPart1 != null)
                {
                    mainDocumentPart1.DeleteParts(mainDocumentPart1.HeaderParts);
                    HeaderPart headPart1 = mainDocumentPart1.AddNewPart<HeaderPart>();
                    GenerateHeaderPart1Content(headPart1);
                    string rId = mainDocumentPart1.GetIdOfPart(headPart1);
                    ImagePart image = headPart1.AddNewPart<ImagePart>("image/jpeg", "rId999");
                    GenerateImagePart1Content(image);
                    IEnumerable<SectionProperties> sectPrs = mainDocumentPart1.Document.Body.Elements<SectionProperties>();
                    foreach (var sectPr in sectPrs)
                    {
                        sectPr.RemoveAllChildren<HeaderReference>();
                        sectPr.PrependChild<HeaderReference>(new HeaderReference() { Id = rId });
                    }
                }
                else
                {
                    MessageBox.Show("alert");
                }
            }
            private void GenerateHeaderPart1Content(HeaderPart headerPart1)
            {
                Header header1 = new Header();
                Paragraph paragraph2 = new Paragraph();
                Run run1 = new Run();
                Picture picture1 = new Picture();
                V.Shape shape1 = new V.Shape() { Id = "WordPictureWatermark75517470", Style = "position:absolute;left:0;text-align:left;margin-left:0;margin-top:0;width:415.2pt;height:456.15pt;z-index:-251656192;mso-position-horizontal:center;mso-position-horizontal-relative:margin;mso-position-vertical:center;mso-position-vertical-relative:margin", OptionalString = "_x0000_s2051", AllowInCell = false, Type = "#_x0000_t75" };
                V.ImageData imageData1 = new V.ImageData() { Gain = "19661f", BlackLevel = "22938f", Title = "水印", RelationshipId = "rId999" };
                shape1.Append(imageData1);
                picture1.Append(shape1);
                run1.Append(picture1);
                paragraph2.Append(run1);
                header1.Append(paragraph2);
                headerPart1.Header = header1;
            }
            private void GenerateImagePart1Content(ImagePart imagePart1)
            {
                System.IO.Stream data = GetBinaryDataStream(imagePart1Data);
                imagePart1.FeedData(data);
                data.Close();
            }
            private string imagePart1Data = "";
            private System.IO.Stream GetBinaryDataStream(string base64String)
            {
                return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String));
            }
            public void SetWaterMarkPicture(string file)
            {
                FileStream inFile;
                byte[] byteArray;
                try
                {
                    inFile = new FileStream(file, FileMode.Open, FileAccess.Read);
                    byteArray = new byte[inFile.Length];
                    long byteRead = inFile.Read(byteArray, 0, (int)inFile.Length);
                    inFile.Close();
                    imagePart1Data = Convert.ToBase64String(byteArray, 0, byteArray.Length);
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.Message);
                }
            }
        }
    }
    

     

    If you still have any questions, please feel free to let me know.

     

    Have a good day,

     

    Tom

     

     

     


    Tom Xu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    mercredi 5 octobre 2011 06:24
    Modérateur
  • Tom,

    Many thanks for your reply. Unfortunately I am unable to get this to work, as when I open the document using MS Word 2007, I get  "The file is corrupt and cannot be opened".

    I have invoked your code above with:

     

    Word word = new Word(true

    );

     

    WatermarkHandler.InsertCustomWatermark(WordprocessingDocument.Open("X:\\nhbcapps\\235HMW.docx", true

    ),

     

    "X:\\nhbcapps\\D375_Buildmark Certi_B56F57.jpg");

    The original 235HMW.docx opens successfully and so does D375_Buildmark Certi_B56F57.jpg.

    I would be grateful if you could further advise.

    Many thanks,    Alan.

     

     
    AlanNHBC
    lundi 5 décembre 2011 16:18
  • My apologies Tom, a colleague has got this code working as follows:

    using (WordprocessingDocument package = WordprocessingDocument.Open(@"E:\NickDevSources\WatermarkFiles\testdoc.docx", true))

                {

                    WatermarkHandler.InsertCustomWatermark(package, @"E:\NickDevSources\WatermarkFiles\Water.jpg");

                }

     

    Thank you again for your help.

     


    AlanNHBC
    jeudi 15 décembre 2011 16:59
  • No event Handler called WatermarkHandler

    Can't able to find WatermarkHandler.

    Reply Soon 

    Thank You

    mardi 11 décembre 2012 12:00
  • Can you help me how to get TextWatermark instead of picture watermark?

    Naveen

    mardi 24 avril 2018 13:52