2014-02-13 5 views
2

Мне нужно добавить водяной знак к документу, когда я нажимаю кнопку на своей собственной ленте. Есть ли способ сделать это с VSTO или OpenXML?Добавить водяной знак в Word 2013

Примеры, которые я нашел, предназначены для VSTO 2005 и не дают желаемого результата. Они просто придают форму в фоновом режиме. Он всегда отображается только на последней странице. Поэтому дополнительные страницы не водяные знаки.

Есть ли способ получить водяной знак, чтобы он отображался, как если бы вы создали его с помощью функции OpenXML или VSTO 2010? Один, который создает один на всей странице, на каждой создаваемой и создаваемой странице.

ответ

2

Это может оказаться полезным: (Taken from here) Хотя это в 2010 году, это может оказаться полезным для вас.

Sub SetWatermarks() 
    Dim scn As Word.Section, hdft As Word.HeaderFooter, shp As Word.Shape 
    With Word.ActiveDocument 
     For Each scn In .Sections 
     For Each hdft In scn.Headers 
      Set shp = hdft.Shapes.AddTextEffect(msoTextEffect2, "Evaluation Only", "Tahoma", 10, False, False, 0, 0) 
      With shp 
      .line.Visible = False 
      With .TextEffect 
       .NormalizedHeight = False 
       .FontItalic = False 
       .FontBold = True 
      End With 
      With .Fill 
       .Visible = True 
       .Solid 
       .ForeColor.RGB = 12632256 
       .Transparency = 0.5 
      End With 
      .Rotation = 315 
      .LockAspectRatio = True 
      .Height = Word.InchesToPoints(1.96) 
      .Width = Word.InchesToPoints(7.2) 
      With .WrapFormat 
       .AllowOverlap = True 
       .Side = Word.wdWrapNone 
       .Type = 3 
      End With 
      .RelativeHorizontalPosition = Word.wdRelativeHorizontalPositionMargin 
      .RelativeVerticalPosition = Word.wdRelativeVerticalPositionMargin 
      .Left = wdShapeCenter 
      .top = wdShapeCenter 
      End With 
     Next hdft 
     Next scn 
    End With 

EDIT И только упаковывают вы хотите, чтобы заменить существующие водяные знаки вот еще немного полезного кода, чтобы найти водяные знаки.

Sub FindWaterMark() 

    Dim doc As Word.Document 
    Dim scn As Word.Section 
    Dim shp As Word.Shape 
    Dim hdft As Word.HeaderFooter 

    Set doc = Word.ActiveDocument 

    With doc 
     For Each scn In .Sections 
     For Each hdft In scn.Headers 
      For Each shp In hdft.Range.ShapeRange 
       If InStr(1, shp.Name, "WordArt") <> 0 Or InStr(1, shp.Name, "Power") <> 0 Then 
        If shp.TextEffect.Text = "Evaluation Only" Then 
         Debug.Print shp.Name 
        End If 
       End If 
      Next shp 
     Next hdft 
     Next scn 
    End With 

End Sub 
1

Да Водяной знак - это всего лишь форма, вставляемая в документ. Когда вы используете VSTO, вам нужно искать в заголовке, а затем добавлять фигуру.

Если у вас есть разные заголовки первой страницы, нечетные и четные заголовки страниц, вам нужно сделать это для каждого типа заголовков в каждом разделе.

так что вот код psuedo. У меня было изображение в строительных блоках с правильной высотой, шириной и положением, поэтому мой код просто вставляет его и всегда отображается посередине. Если вы вставляете свою форму через код, вам нужно позаботиться об этом.

foreach (Section sec in document.Sections) 
{ 
    foreach (HeaderFooter headerFooter in sec.GetHeadersFooters()) 
    { 
     document.ActiveWindow.View.set_SeekView(headerFooter.IsHeader 
       ? WdSeekView.wdSeekCurrentPageHeader:WdSeekView.wdSeekCurrentPageFooter); 
       **//Insert the shape** 
     InsertFromBuildingBlocks(headerFooter.Range); 
    } 
    document.ActiveWindow.View.set_SeekView(WdSeekView.wdSeekMainDocument); 
} 

    //This is extension method used above 
    public static IEnumerable<HeaderFooter> GetHeadersFooters(this Section section) 
    { 
     List<HeaderFooter> headerFooterlist = new List<HeaderFooter> 
      { 
       section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary], 
       section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage], 
       section.Headers[WdHeaderFooterIndex.wdHeaderFooterEvenPages], 
       section.Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary], 
       section.Footers[WdHeaderFooterIndex.wdHeaderFooterFirstPage], 
       section.Footers[WdHeaderFooterIndex.wdHeaderFooterEvenPages] 
      }; 

     return headerFooterlist; 
    } 
Смежные вопросы