[Office | Word | C#] Word浮水印系列(1)-在Word中加入浮水印(Watermark)圖片

之前有曾寫過一些有關Excel的浮水印相關文章,這次則是要針對Word部分,而在Word的部分,在實際開發上,沒有遇到Excel這麼多的問題在,但是在插入浮水印時卻需要多思考一些問題。

前言

 


 

之前有曾寫過一些有關Excel的浮水印相關文章,這次則是要針對Word部分,而在Word的部分,在實際開發上,沒有遇到Excel這麼多的問題在,但是在插入浮水印時卻需要多思考一些問題。

此篇介紹如何插入浮水印圖片至Word中。

 

開始前的注意事項

 


 

在Excel的[Office | Excel | C#] 如何使頁首頁尾的圖片浮水印不會受到縮放比例(Pagesetup Zoom Scale Ratio)影響 此篇文章中,曾經提到的注意事項-有關於「電腦字體的小中大對浮水印圖片的縮放影響」與「新舊格式Docx與Doc對於插入浮水印的文件,拿至到別台電腦上瀏覽時,對浮水印圖片的自動縮放調整影響」,仍然存在。

 

然而對於[Office | Excel | C#] 如何取得Excel 版面配置(Pagesetup)的紙張大小(PaperSize)與寬高(Width/Height) 此篇中提到的取得紙張大小問題,在Word中不會這麼繞路,很容易處理,這部分也會在後續提到。

 

 

在Word中插入浮水印的介紹與方式

 


 

在Word中插入浮水印,也一樣是透過圖片插入,並且插入在「頁首頁尾」,因此我們也仍須考量到奇偶頁,與第一頁頁首頁尾,還有紙張大小的問題,但這些部份我們在後續討論。

 

1. 插入浮水印圖片與Section的關係

在Word中要插入頁首頁尾是透過Section中的HeaderFooter屬性,加入一個圖片的Shape到其中。

Section在Word是「節」,並非是Page,一個Section代表一個區塊,可以同時涵蓋好多頁,或是一頁中有多個Section,這部分都可以透過版面配置中的「分隔設定」做插入。

Section 分隔設定

 

 

因此可能一個70多頁的Word檔案只有三個Section或一個Section,並且每一個Section只會代表一種頁首頁尾的屬性,甚至,某些Section的所有頁面被刪除,因此在文件上看不到,但程式中仍可以偵測到,例如以下例子:

Section 1 (中文翻節1)是第一頁頁首頁尾的屬性,涵蓋的只有第1頁

Section 2 (節2) 曾經存在,包含第2頁與第3頁,但是被刪除掉了,可是程式仍偵測到有Section2,但會是空的

Section 3(節3) 是奇偶頁頁首頁尾的屬性,涵蓋的是第2頁至60頁(因為Section2的頁面被刪掉,所以自動變成第2頁),這其中只要是偶數頁則會顯示偶數頁首頁尾-節3,奇數頁則都會被稱做奇數頁首頁尾-節3。

 

另外如果是奇偶頁的類型,奇頁與偶頁 都是一節! 所以若你按下移動至下一節(Next Section) 則可能會看到 偶數頁首頁尾-節3 換到 奇數頁首頁尾-節3  或相反偶至奇,但他們仍然都是Section 3。

至於一般的頁首頁尾,則不管是多少頁,如果按下 移動至下一節(Next Section) ,則會直接跳至下一個Section

 

PS:上述提到的第1頁,第2頁等頁數不是頁碼,只是開啟檔案時看到的頁面順序。

以下是Word文件參考:

HeaderFooter

 

一個Section內,除了使用了同一份頁首頁尾,在修改版面配置的寬高或是紙張大小,方向時,也會同時被修改。

換句話說,同一個Section,紙張大小與方向,以及頁首頁尾的類型都會一致,所以無須擔心其中某一頁方向或大小不同,若是方向或大小不同,則代表了那是另一個Section。
 

如下因為是不同Section,所以修改時,只會是下面的Section被修改。

Section對版面配置影響

 

程式碼如下:

首先我們要能夠取得所有的Section,並且對每一個Section取取得headerFooter,並做插入:


Word.Section firstSection = sections.First;

Word.Sections sections = doc.Sections;

for (int section_index = 2; section_index < sections.Count + 1; section_index++)
{

        Word.Section currentSection = sections[section_index];

        //插入浮水印

}

第一個Section可以直接透過First屬性取得,或者是透過下面的迴圈尋訪。

如果要透過迴圈尋訪,這邊要注意一下的是,在Word與Excel這些Office的開發中,所有的陣列,都是從索引1開始,因此要修改為1,否則之後的Section 則可以如我這邊一樣改為2從第2個開始。

 

 

2. 插入浮水印圖片至頁首頁尾

再來我們便可以透過上述currentSection取得頁首頁尾並插入圖片。

在插入圖片至頁首頁尾時,一樣會有第一頁頁首頁尾、奇偶頁頁首頁尾與一般頁首頁尾可以選,與判斷,但這部份我們留到下個篇章。


private void AddWatermarkToPageHeaderFooter(Word.HeaderFooter headerFooter, string watermarkImgPath, int pageWidth, int pageHeight)
{

Word.Shape wmShape;

    //需要先給圖片的大小,然後先設定在版面的左上角為起始值
    wmShape = headerFooter.Shapes.AddPicture(watermarkImgPath,
                                                         Office.MsoTriState.msoTrue,
                                                         Office.MsoTriState.msoTrue,
                                                         0,
                                                         0,
                                                         pageWidth,
                                                         pageHeight);

    //使浮水印可以在整張Page的任何位置調整
    //調整左上角位置
    wmShape.Left = Convert.ToSingle(Word.WdShapePosition.wdShapeLeft); //填0還是會在版面設定
    wmShape.Top = Convert.ToSingle(Word.WdShapePosition.wdShapeTop);

    wmShape.SetShapesDefaultProperties();
    wmShape.ZOrder(Office.MsoZOrderCmd.msoBringToFront);
    wmShape.WrapFormat.AllowOverlap = -1; //true
    wmShape.WrapFormat.Side = Word.WdWrapSideType.wdWrapBoth;
    wmShape.WrapFormat.Type = Word.WdWrapType.wdWrapBehind;  //3

    //使wmShape Left Top可以不受版面設定的邊界位置限制       
    wmShape.RelativeHorizontalPosition = Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionPage;
    wmShape.RelativeVerticalPosition = Word.WdRelativeVerticalPosition.wdRelativeVerticalPositionPage;

}

參數方面,watermarkImgPath 是浮水印圖片檔案的路徑,而pageWidth與pageHeight是Shape的寬高-在這裡代表的是Word現在這個Section內的頁面寬高,以下解釋。

 

在Word中,像是圖片,文字方塊或是其他類型的內容,會以Shape的方式紀錄,因此都會有一個座標起始位置 與寬高的設定。

如上我們設定此Shape的寬高便是pageWidth與pageHeight,而在這邊我們期望浮水印的圖片是占滿整個頁面的寬高,所以便會需要透過版面設定-PageSetup取得寬高。

 

3.PageSetup取得紙張大小的寬高

而在Word中不像Excel要取得紙張大小還需要借助印表機,而是在其中便有提供,如下:


int pageWidth = (int)currentSection.PageSetup.PageWidth;
int pageHeight (int)currentSection.PageSetup.PageHeight;




呼叫剛剛寫的插入浮水印方法,插入一般的頁首頁尾類型 Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary],


AddWatermarkToPageHeaderFooter(sections.First.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary],
               /*圖片的檔案路徑*/,
              pageWidth,
              pageHeight);

 

 

4.調整Shape的位置不受版面設定的邊界影響

在一開始我們透過AddPicture方法,放入圖片至Shape時,指定的起始座標是0,0,這會使圖片被限制在版面設定的邊界範圍內,並且因為我在這裡,是設定寬高為整張紙張大小,所以右邊與下面會超出顯示的範圍。

浮水印圖片-Shape的位置在邊界Boder內

 

如果我們希望它是從紙張的左上角開始貼,則需要以四行:


//使浮水印可以在整張Page的任何位置調整
//調整左上角位置
wmShape.Left = Convert.ToSingle(Word.WdShapePosition.wdShapeLeft); //填0還是會在版面設定
wmShape.Top = Convert.ToSingle(Word.WdShapePosition.wdShapeTop);

//使wmShape Left Top可以不受版面設定的邊界位置限制       
wmShape.RelativeHorizontalPosition = Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionPage;
wmShape.RelativeVerticalPosition = Word.WdRelativeVerticalPosition.wdRelativeVerticalPositionPage;

 

先設定為wdShapeLeft 與 wdShapeTop從紙張的左上角開始,並且設定WdRelativeHorizontalPosition與RelativeVerticalPosition屬性,使其Left與Top的設定可以有效,才會產生如下的結果:

對齊左上角浮水印

 

以上便是,基本的插入浮水印圖片方式與一些Word插入時的介紹。

 

後記

 


 

在開發上,因為當初是從Word先開始寫,所以在Excel寫的時候已經有考慮到頁首頁尾、紙張大小與方向的問題在,並且Excel一個Sheet就只會有一種Section,所以也就只有一種頁首頁尾的類型,比較輕鬆去寫,但卻沒想到Excel有著特別縮放比例,後續還有印表機問題,所以考了很多時間在那部分。

 

接下來,要考慮到同一個Section內不同頁首頁尾的類型 與 不同Section下由於LinkToPrevious-連結致前一節,對浮水印Section造成的影響。

 

 

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝