问题描述
这是我的文档合并类:
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将打开结果文件而不会发出警报。
我看到了1,2这些问题,但并没有帮助我。也许我错过了一些东西。拜托,你能帮我吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)