从一个Word文档拷贝Header到另一个Word文档
下面的示例将拷贝一个文档的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); } } } }
欢迎访问《许阳的红泥屋》
征诛志异,三让两家王朝;功同开辟,一桮万古江南。