之前有曾寫過一些有關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,這部分都可以透過版面配置中的「分隔設定」做插入。
因此可能一個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文件參考:
一個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,這會使圖片被限制在版面設定的邊界範圍內,並且因為我在這裡,是設定寬高為整張紙張大小,所以右邊與下面會超出顯示的範圍。
如果我們希望它是從紙張的左上角開始貼,則需要以四行:
//使浮水印可以在整張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造成的影響。
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝