如何使用C#.Net通过Microsoft.Interop.word比较word文档每页中显示的图像(形状)?

如何使用C#.Net通过Microsoft.Interop.word比较word文档每页中显示的图像(形状)?,c#,ms-word,interop,C#,Ms Word,Interop,我正在使用以下代码替换图像(Microsoft.Interop.Office.Word中的形状)但客户的要求是,我需要检查word文档第一页的第一个图像,然后将此图像与文档其余部分的图像进行比较,如果匹配,则将其替换为新图像,否则不需要如何比较两个形状(图像)的帮助 public void ReplaceWordImage(字符串文件路径) { Word.Document d=新的Word.Document(); Word.applicationwordapp; WordApp=新的Micros

我正在使用以下代码替换图像(Microsoft.Interop.Office.Word中的形状)但客户的要求是,我需要检查word文档第一页的第一个图像,然后将此图像与文档其余部分的图像进行比较,如果匹配,则将其替换为新图像,否则不需要如何比较两个形状(图像)的帮助

public void ReplaceWordImage(字符串文件路径)
{
Word.Document d=新的Word.Document();
Word.applicationwordapp;
WordApp=新的Microsoft.Office.Interop.Word.Application();
bool headerImage=错误;
尝试
{
缺少对象=System.Reflection.missing.Value;
对象是=真;
对象号=假;
对象文件名=@“D:/ImageToReplace/5.docx”;
d=WordApp.Documents.Open(参考文件名、参考缺失、参考编号、参考缺失、,
参考缺失,参考缺失,参考缺失,参考缺失,参考缺失,参考缺失,
参考缺失、参考缺失、参考是、参考缺失、参考缺失、参考缺失、参考缺失);
列表范围=新列表();
列表标题=新列表();
foreach(d.Shapes中的Word.Shape)
{
if(shape.Type==Microsoft.Office.Core.MsoShapeType.msoPicture)
{
shape.Delete();
foreach(范围中的单词范围r)
`在此处输入代码`{
r、 InlineShapes.AddPicture(@“D:\Untitled.jpg”,缺少ref,缺少ref);
打破
}
}

Word对象模型不提供任何东西来比较两个图像。最好的办法是将两个图像都保存在磁盘上,然后尝试比较两个图像的字节表示形式。但是,有一种更好的方法来完成这项工作。答案是允许在不保存图像的情况下动态获取图像的字节表示形式到之前的磁盘。
Open XML SDK
包含一个类
WordprocessingDocument
,该类可以操作包含
WordDocument
内容的内存流。
MemoryStream
可以使用
ToArray()
转换为
字节[]
。有关更多信息,请参阅。

这两种方法都不可靠,因为文档中呈现的图像(与它们在XML中的存储方式无关)可能会以不同方式缩放或裁剪。确保一系列图像相同的更好方法是插入一次,将其添加到书签中,然后交叉引用bookma在其他需要图像的地方标记。此外,如果图像位于给定的页眉/页脚中(每个部分有3个),每个页面上显示的副本必须相同,除非使用字段编码处理不同页面上显示的图像。目的是比较图像,对吗?@Eugent:-Word文档已存在20-25个图像,并且只需要替换徽标图像,徽标图像可能会或可能不会出现在文档的每个页面上,但始终存在t位于文档的第一页。用户单独添加了它,而不是标题的一部分,因此即使使用openxml,似乎也需要提供文件名的路径,如byte[]templateContent=file.ReadAllBytes(templateFile);因此,在上述情况下,我们是否需要首先下载文件的所有图像并转换为字节流,检查它们是否相等,或者必须首先将徽标图像转换为字节数组,然后完成文档到字节数组,然后将文档字节数组与图像字节数组进行比较。即使我们这样做,我们也可以简单地替换该数量字节数组与其他图像字节数组的比较。如果我的理解与您实际想要建议的不同,请更正。是的,目标是将该文档的所有图像与该文档的第一个图像进行比较,并将第一个图像以及与第一个图像匹配的所有图像替换为其他图像,因为它是徽标图像
public void ReplaceWordImage(string FilePath)
        {
            Word.Document d = new Word.Document();
            Word.Application WordApp;
            WordApp = new Microsoft.Office.Interop.Word.Application();
            bool headerImage = false;
            try
            {

                object missing = System.Reflection.Missing.Value;
                object yes = true;
                object no = false;
                object filename = @"D:/ImageToReplace/5.docx";


                d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing,
                   ref missing, ref missing, ref missing, ref missing, ref missing,
                   ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing);
                List<Word.ShapeRange> ranges = new List<Microsoft.Office.Interop.Word.ShapeRange>();
                List<Word.ShapeRange> headerRanges = new List<Microsoft.Office.Interop.Word.ShapeRange>();

  foreach (Word.Shape shape in d.Shapes)
                        {
                            if (shape.Type == Microsoft.Office.Core.MsoShapeType.msoPicture)
                            {
shape.Delete();

foreach (Word.Range r in ranges)
                                `enter code here`    {
                                        r.InlineShapes.AddPicture(@"D:\Untitled.jpg", ref missing, ref missing);
                                        break;

                                    }
}