下面的示例将拷贝一个文档的Header(默认每页都出现的Header)到另一个文档。在这里为了简便起见,在Header中只有一个png图像。在实际工作中我们可以通过修改NewHeader方法来使程序符合自己要求。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using log4net;
using com.mksword.Net.OpenXmlTools;
using A = DocumentFormat.OpenXml.Drawing;
using Pic = DocumentFormat.OpenXml.Drawing.Pictures;
namespace ConsoleApplication3
{
public class CopyHeaderImage : WordprocessingDocumentUtil
{
private HeaderPart _Header = null;
private ImagePart _Image = null;
public void Action()
{
OpenedDocumentHander(ReadHeaderImage);
}
private bool ReadHeaderImage(WordprocessingDocument WPD)
{
bool result = false;
MainDocumentPart MDP = WPD.MainDocumentPart;
Document D = MDP.Document;
SectionProperties SPS = D.Descendants<SectionProperties>()
.FirstOrDefault();
HeaderReference HR = SPS.Descendants<HeaderReference>()
.Where(H => H.Type == HeaderFooterValues.Default)
.FirstOrDefault();
HeaderPart HP = MDP.GetPartById(HR.Id) as HeaderPart;
_Image = HP.ImageParts.FirstOrDefault();
CopyHeader(HP);
return result;
}
private void CopyHeader(HeaderPart HP)
{
_Header = HP;
OpenedDocumentHander(CopyHeaderHandler,true);
}
private bool CopyHeaderHandler(WordprocessingDocument WPD)
{
bool result = false;
MainDocumentPart MDP = WPD.MainDocumentPart;
Document D = MDP.Document;
SectionProperties SPS = D.Descendants<SectionProperties>()
.FirstOrDefault();
HeaderReference HR = SPS.Descendants<HeaderReference>()
.Where(H => H.Type == HeaderFooterValues.Default)
.FirstOrDefault();
if (HR != null)
{
HeaderPart older = MDP.GetPartById(HR.Id) as HeaderPart;
MDP.DeletePart(older);
NewHeader(MDP, HR);
}
else
{
HR = new HeaderReference()
{
Type = HeaderFooterValues.Default,
Id = string.Empty
};
NewHeader(MDP, HR);
SPS.Append(HR);
}
D.Save();
SetLog("Success!", OXULogType.INFO);
return result;
}
private void NewHeader(MainDocumentPart MDP,HeaderReference HR)
{
HeaderPart newHeader = MDP.AddNewPart<HeaderPart>();
if (_Header != null && _Image != null)
{
newHeader.FeedData(_Header.GetStream());
ImagePart imagePart = newHeader.AddImagePart(ImagePartType.Png);
imagePart.FeedData(_Image.GetStream());
string ImageId = newHeader.GetIdOfPart(imagePart);
Header H = newHeader.Header;
Paragraph P = H.Descendants<Paragraph>().FirstOrDefault();
Run R = P.Descendants<Run>().First();
Drawing D = R.Descendants<Drawing>().First();
A.GraphicData GD = D.Inline.Graphic.GraphicData;
Pic.Picture Pic = GD.Descendants<Pic.Picture>()
.FirstOrDefault();
Pic.BlipFill BF = Pic.Descendants<Pic.BlipFill>()
.FirstOrDefault();
BF.Blip.Embed = ImageId;
HR.Id = MDP.GetIdOfPart(newHeader);
}
else
{
SetLog("_Header wasn't set", OXULogType.FATAL);
}
}
}
}
欢迎访问《许阳的红泥屋》