图像(非内嵌形状)从 Word 到剪贴板再到文件

本文关键字:Word 剪贴板 文件 图像 | 更新日期: 2023-09-27 18:35:18

我有一个Word文档(在下面的代码中称为"doc")带有一堆.jpg图像。其中一些有环绕的文本(= 形状),其中一些没有(= 内联形状)。我能够像这样保存内联形状:

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();

– 它行不通。如果我用"数据"检查格式。GetFormats()" 我注意到位图没有列出,这解释了为什么它不起作用。相反,它列出了"办公室绘图形状格式"。我想我应该尝试以某种方式将形状转换为内联形状,但我无法使其工作。当我尝试这样做时——

s.ConvertToInlineShape();

– 我收到"无效参数"异常。

图像(非内嵌形状)从 Word 到剪贴板再到文件

好的,问题似乎是我试图在错误的时间转换它。如果我遍历所有形状并在尝试执行其他任何操作之前转换它们,它工作正常。

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);
}