如何使用图像和链接从Word Document复制内容?

时间:2014-09-05 15:29:37

标签: c# ms-word openxml

将内容从Word文档复制到另一个Word文档时,我遇到了一些问题。 信息应该最终出现的文件有一个标题。

到目前为止,我已设法将内容复制到第二个文档而不影响标题。 但是,我无法弄清楚如何绑定链接和图像的关系。

到目前为止,这是我的代码:

public static void AddContentToTemplateCopy(
                        string sourceDocumentPath, string endDocumentPath)
{
     using (WordprocessingDocument sourceDoc = 
            WordprocessingDocument.Open(sourceDocumentPath, false))
     using (WordprocessingDocument endDoc = 
            WordprocessingDocument.Open(endDocumentPath, true))
     {
            var sourceMainPart = sourceDoc.MainDocumentPart;
            var sourceBody = sourceMainPart.Document.Body;

            var endSection = endDoc.MainDocumentPart.Document.Body.Elements<SectionProperties>();
            var endDocMainPart = endDoc.MainDocumentPart;
            var sourceBodyClone = sourceBody.CloneNode(true);
            sourceBodyClone.ReplaceChild(endSection.FirstOrDefault().CloneNode(true), sourceBodyClone.Elements<SectionProperties>().FirstOrDefault());
            endDocMainPart.Document.ReplaceChild(sourceBodyClone, endDocMainPart.Document.Body);

            foreach (HyperlinkRelationship link in sourceMainPart.HyperlinkRelationships)
            {
                endDocMainPart.AddHyperlinkRelationship(link.Uri, link.IsExternal, link.Id);
            }
}

我收到以下错误:&#39; rId6&#39; ID与指定源的现有关系的ID冲突。

如果我在内容中有图像则无法显示。

如果我压缩文档并查看包中的文件,我可以找到图像,但出于与链接相同的原因,关系

所以我的问题是:如何将链接和图片与他们的&#34; _rels&#34;参考?或者我如何复制它们才能起作用..

当我手动添加链接时,这是一个关系链接。

<Relationship Target="media/image1.jpg" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Id="rId11"/>

显示链接文本已复制但没有格式且无法显示图像的图片。

enter image description here

2 个答案:

答案 0 :(得分:2)

感谢JasonPlutext的回答,我设法使用OpenXML PowerTools (Version 2.2).请记住,导入项目时.Net版本是3.5。你可能需要改变它。 (支持Open XML 2.5以及我注意到的)

创建新文档并从旧文档中获取部件非常简单。

这里的代码是我的情况,我希望格式和内容来自一个,然后是模板文档中的标题。订单很重要。

希望这会为遇到同样问题的其他人节省时间。

public static void AddContentToTemplateCopy(string templateDocumentPath, 
                                            string contentDocumentPath, 
                                            List<Source> sources, 
                                            string outName)
    {
        sources = new List<Source>()
        {
            new Source(new WmlDocument(contentDocumentPath),false),
            new Source(new WmlDocument(templateDocumentPath),true),
        };
        DocumentBuilder.BuildDocument(sources, outName);
    }

答案 1 :(得分:1)

您可能会发现尝试Eric White的document builder更容易。