Wednesday, August 6, 2014

Insert watermark (background image) in word document using OPEN XML SDK

Insert watermark in word document using OPEN XML SDK


// if watermark image is available in site assets document library then attach to document
                        SPFile waterMarkFile = GetWatermarkImage(watermarkFleName);
                        if (waterMarkFile != null)
                        {
                            InsertCustomWatermark(myDoc, waterMarkFile);
                        }


    #region Watermark
        private void InsertCustomWatermark(WordprocessingDocument package, SPFile p)
        {
            try
            {
                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 });
                    }
                }
            }
            catch (Exception ex)
            {
                ULSLogService.DisplayError(this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name, ex);
            }
        }
        private void GenerateHeaderPart1Content(HeaderPart headerPart1)
        {
            try
            {
                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;
            }
            catch (Exception ex)
            {
                ULSLogService.DisplayError(this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name, ex);
            }
        }
        private void GenerateImagePart1Content(ImagePart imagePart1)
        {
            try
            {
                System.IO.Stream data = GetBinaryDataStream(imagePart1Data);
                imagePart1.FeedData(data);
                data.Close();
            }
            catch (Exception ex)
            {
                ULSLogService.DisplayError(this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name, ex);
            }
        }
        private string imagePart1Data = "";
        private System.IO.Stream GetBinaryDataStream(string base64String)
        {
            return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String));
        }
        public void SetWaterMarkPicture(SPFile file)
        {
            try
            {
                byte[] byteArray = file.OpenBinary();
                imagePart1Data = System.Convert.ToBase64String(byteArray, 0, byteArray.Length);
            }
            catch (Exception ex)
            {
                ULSLogService.DisplayError(this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name, ex);
            }
        }



        #endregion



   #region Get Item from Site Assets Library
        private SPFile GetWatermarkImage(string ItemName)
        {
            SPFile file = null;
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                   {
                       using (SPSite spSite = new SPSite(SPContext.Current.Web.Url + "/sites/training"))
                       {
                           using (SPWeb spWeb = spSite.OpenWeb())
                           {
                               spWeb.AllowUnsafeUpdates = true;
                               SPList spList = spWeb.Lists.TryGetList("Site Assets");

                               if (spList != null)
                               {
                                   SPQuery qry = new SPQuery();
                                   qry.Query =
                                   string.Format(@"<Where>
                                 <Eq>
                                    <FieldRef Name='LinkFilename' />
                                    <Value Type='Computed'>{0}</Value>
                                </Eq>
                               </Where>", ItemName);
                                   qry.ViewFields = @"<FieldRef Name='FileRef' />";
                                   qry.RowLimit = 1;
                                   SPListItemCollection listItems = spList.GetItems(qry);
                                   if (listItems.Count > 0)
                                   {
                                       SPListItem item = listItems[0];
                                       file = item.File;
                                   }
                               }
                           }
                       }
                   });
            }
            catch (Exception ex)
            {
                ULSLogService.DisplayError(this.GetType().Name + "." + MethodBase.GetCurrentMethod().Name, ex);
            }
            return file;
        }


        #endregion

No comments:

Post a Comment