从一个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);
            }
        }
    }
}

欢迎访问《许阳的红泥屋
posted @ 2012-10-30 16:57  许阳 无锡  阅读(346)  评论(0编辑  收藏  举报