将带有图像的docx内容复制到另一个docx文档中

问题描述

我需要将一个docx文件内容粘贴到另一个docx文件中。

这是我的文档合并类:

public class DocumentMerger
{
    private readonly WordprocessingDocument _targetDocument;

    public DocumentMerger(WordprocessingDocument targetDocument)
    {
        _targetDocument = targetDocument;
    }

    public void Merge(WordprocessingDocument mergingDocument)
    {
        var toPlace = _targetDocument.MainDocumentPart.Document.Body.FirstChild;

        foreach (var element in mergingDocument.MainDocumentPart.Document.Body.Elements())
        {
            copyRelativeElements(element,_targetDocument.MainDocumentPart,mergingDocument.MainDocumentPart);
            toPlace.InsertAfterSelf(element.CloneNode(true));
        }
    }

    private void copyRelativeElements(OpenXmlElement element,MainDocumentPart docPartTo,MainDocumentPart docPartFrom)
    {
        //images
        element.Descendants<DocumentFormat.OpenXml.Drawing.Blip>().ToList()
            .ForEach(blip =>
            {
                var newRelation = copyImagePart(docPartTo,blip.Embed,docPartFrom);
                blip.Embed = newRelation;
            });
    }

    private string copyImagePart(MainDocumentPart docPartTo,string relId,MainDocumentPart docPartFrom)
    {
        var p = docPartFrom.GetPartById(relId) as ImagePart;
        var newPart = docPartTo.AddPart(p);
        newPart.FeedData(p.GetStream(FileMode.Open,FileAccess.Read));
        return docPartTo.GetIdOfPart(newPart);
    }
}

一个使用此类的程序:

class Program
{
    static void Main(string[] args)
    {
        var firstDoc = WordprocessingDocument.Open("File1.docx",true);

        var secondDoc = WordprocessingDocument.Open("File2.docx",false);

        var merger = new DocumentMerger(firstDoc);

        merger.Merge(secondDoc);

        firstDoc.Close();
        secondDoc.Close();
    }
}

如果mergingDocument不包含图像,则一切正常。但是我无法正确执行图像处理。打开结果文件时,MS Office会警告该文件已被更正。 MS Office修复结果,一切看起来都应该如此。

但是我不明白到底什么可以修复MS Office。手动查看未压缩的结果文件时,我仅看到重命名关系ID。

例如,在 /word/document.xml 中修复之前,存在这样的<w:drawing>元素:

<w:drawing>
    <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="34AA245D" wp14:editId="2ED47BBF">
        <wp:extent cx="189865" cy="189865"/>
        <wp:effectExtent l="0" t="0" r="635" b="635"/>
        <wp:docPr id="1" name="Picture 1"/>
        <wp:cNvGraphicFramePr>
            <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
        </wp:cNvGraphicFramePr>
        <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
            <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
                <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
                    <pic:nvPicPr>
                        <pic:cNvPr id="0" name="Picture 1"/>
                        <pic:cNvPicPr>
                            <a:picLocks noChangeAspect="1" noChangeArrowheads="1"/>
                        </pic:cNvPicPr>
                    </pic:nvPicPr>
                    <pic:blipFill>
                        <a:blip r:embed="Rfa237844834a44c5">
                            <a:extLst>
                                <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                                    <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/>
                                </a:ext>
                            </a:extLst>
                        </a:blip>
                        <a:srcRect/>
                        <a:stretch>
                            <a:fillRect/>
                        </a:stretch>
                    </pic:blipFill>
                    <pic:spPr bwMode="auto">
                        <a:xfrm>
                            <a:off x="0" y="0"/>
                            <a:ext cx="189865" cy="189865"/>
                        </a:xfrm>
                        <a:prstGeom prst="rect">
                            <a:avLst/>
                        </a:prstGeom>
                        <a:noFill/>
                        <a:ln>
                            <a:noFill/>
                        </a:ln>
                    </pic:spPr>
                </pic:pic>
            </a:graphicData>
        </a:graphic>
    </wp:inline>
</w:drawing>

文件 /word/_rels/document.xml.rels 包含以下关系:

<Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="/word/media/image12.png" Id="Rfa237844834a44c5" />

修复<w:drawing>后仅更改r:embed值:

    <w:drawing>
    <wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="34AA245D" wp14:editId="2ED47BBF">
        <wp:extent cx="189865" cy="189865"/>
        <wp:effectExtent l="0" t="0" r="635" b="635"/>
        <wp:docPr id="1" name="Picture 1"/>
        <wp:cNvGraphicFramePr>
            <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
        </wp:cNvGraphicFramePr>
        <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
            <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
                <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
                    <pic:nvPicPr>
                        <pic:cNvPr id="0" name="Picture 1"/>
                        <pic:cNvPicPr>
                            <a:picLocks noChangeAspect="1" noChangeArrowheads="1"/>
                        </pic:cNvPicPr>
                    </pic:nvPicPr>
                    <pic:blipFill>
                        <a:blip r:embed="rId7">
                            <a:extLst>
                                <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
                                    <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/>
                                </a:ext>
                            </a:extLst>
                        </a:blip>
                        <a:srcRect/>
                        <a:stretch>
                            <a:fillRect/>
                        </a:stretch>
                    </pic:blipFill>
                    <pic:spPr bwMode="auto">
                        <a:xfrm>
                            <a:off x="0" y="0"/>
                            <a:ext cx="189865" cy="189865"/>
                        </a:xfrm>
                        <a:prstGeom prst="rect">
                            <a:avLst/>
                        </a:prstGeom>
                        <a:noFill/>
                        <a:ln>
                            <a:noFill/>
                        </a:ln>
                    </pic:spPr>
                </pic:pic>
            </a:graphicData>
        </a:graphic>
    </wp:inline>
</w:drawing>

文件 /word/_rels/document.xml.rels 关系中更改ID。目标正确(MS Office重命名图像文件):

<Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image2.png"/>

如果我手动在解压缩的docx文件中的word / document.xml <w:drawing>元素中删除,MS Office将打开结果文件而不会发出警报。

我看到了12这些问题,但并没有帮助我。也许我错过了一些东西。拜托,你能帮我吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)