我有一个Word文档(在下面的代码中称为“ doc”),其中包含一堆.jpg图片。其中一些文本环绕着它们(=形状),而有些则没有(= InlineShapes)。我可以像这样保存InlineShapes:

InlineShape ils = doc.InlineShapes[1];
ils.Select();
application.Selection.Copy();
IDataObject data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Bitmap)) {
    Image image = (Image)data.GetData(DataFormats.Bitmap, true);
        image.Save("c:\\image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}


但是,如果我尝试通过用这些内容替换前两行来获取其他内容,

Shape s = doc.Shapes[1];
s.Select();


–它不起作用。而且,如果我使用“ data.GetFormats()”检查格式,则会注意到未列出位图,这说明了为什么它不起作用。而是列出了“ Office绘图形状格式”。我想我应该尝试以某种方式将Shape转换为InlineShape,但是我无法使其工作。当我尝试这样做时–

s.ConvertToInlineShape();


–我收到“无效参数”异常。

最佳答案

好的,问题似乎出在我尝试在错误的时间进行转换的问题。如果我尝试遍历所有Shape并进行转换,然后再尝试进行其他操作,则效果很好。

int number = doc.InlineShapes.Count;
MessageBox.Show(number.ToString()); // 0 to begin with

foreach (Microsoft.Office.Interop.Word.Shape s in doc.Shapes) {
    MessageBox.Show(s.Type.ToString());
    if (s.Type.ToString() == "msoTextBox") {
        MessageBox.Show(s.TextFrame.TextRange.Text);
    } else if (s.Type.ToString() == "msoPicture") {
        s.ConvertToInlineShape();
    }
}

number = doc.InlineShapes.Count;
MessageBox.Show(number.ToString());  // Now it's 1 as it should be

InlineShape ils = doc.InlineShapes[1];
ils.Select();
application.Selection.Copy();

IDataObject data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Bitmap)) {
    Image image = (Image)data.GetData(DataFormats.Bitmap, true);
    image.Save("c:\\image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}

10-08 20:07