获取Word文档中的所有图片

Get all images in a Word document

我正在尝试获取 Word 文档中的图像集。此页面的文档:https://dev.office.com/reference/add-ins/word/inlinepicture 字面意思是示例的剪切和粘贴,实际上并未显示如何获取图像 - 仅显示第一个图像。

每张图片我需要以下内容:

到目前为止我有以下代码,但我真的不确定它是否有效:

Word.run(

async (context) =>
{
    // Create a proxy object for the pictures.
    const allPictures = context.document.body.inlinePictures;

    // Queue a command to load the pictures
    context.load(allPictures);

    // Synchronize the document state by executing the queued commands,
    // and return a promise to indicate task completion.
    return context.sync().then(() => allPictures);
})
.then((allPictures) =>
{
    const images: IFileData[] = [];
    let picture: Word.InlinePicture | undefined;
    let imageCount = 0;

    while (undefined !== (picture = allPictures.items.pop()))
    {
        const data = picture.getBase64ImageSrc();
        const extension = ""; // TODO: no idea how to find this
        const filename =
            (
                Strings.isNullOrEmpty(picture.altTextTitle)
                    ? `image_${imageCount++}`
                    : Path.toFriendlyUrl(picture.altTextTitle)
            )

        images.push({
            filename: filename + extension,
            data: data
        });
    }

    resolve(images);
})
.catch((e) => reject(e));

我在这里使用了一些自定义助手,它们执行以下操作:


我目前的做法是否正确?

"Correct" 是有效的...我可以解决一个具体问题:获取图像类型 - 您所说的 "file name"。由于这有点长,答案是:可以,但你必须努力一点。

Word 并不总是为文档中的图像存储文件名,除非该图像链接到外部源。然而,它存储的是图像本身,以及在 Word Open XML 文档中管理它所需的信息。存储的信息的一部分是图形图像 type 作为文档和图像二进制代码之间内部关系的一部分。

对象模型(无论是 JS 还是 COM)不提供对此信息的任何直接访问。但是,可以从文档的 Word Open XML 中读取它。这段代码可以获得OPC平面文件格式的InlineShape的具体Word Open XML字符串:

    const range = context.document.body.inlinePictures.getFirst();
    var sXML = range.getRange("Whole").getOoxml();
    range.load("Ooxml");

    await context.sync();

    console.log(sXML.value);

在 Open XML 的 document.xml 部分中,(部分)引用了一个 InlineShape,如下所示 - 查看具有属性 r:embed="rId6".[=18= 的最后一个元素]

<w:p><w:r><w:drawing><wp:inline distT="0" distB="0" distL="0"
distR="0"><wp:extent cx="2944608" cy="1753392"/><wp:effectExtent l="0"
t="0" r="8255" b="0"/><wp:docPr id="1" name="Picture 1"/>
<wp:cNvGraphicFramePr><a:graphicFrameLocks noChangeAspect="1" 
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/>
</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="Schweiz.png"/><pic:cNvPicPr/></pic:nvPicPr>
<pic:blipFill><a:blip r:embed="rId6">...

rId6 是关系 ID - 它告诉 Word 在哪里查找有关嵌入图像的详细信息。这是在 <pkg:part pkg:name="/word/_rels/document.xml.rels" 中找到的,像这样:

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

如您所见,此处提供了文件类型。如果你使用标准的XML工具来解析XML字符串,你可以得到这样的信息。

使用标准 XML 技术的替代方法是使用标准 Microsoft Open XML SDK(C# 或 VB.NET)分析 Word Open XML 或为 JavaScript (http://www.ericwhite.com/blog/open-xml-sdk-for-javascript/) 使用 Open XML SDK。在这种情况下,您无法直接读取 "rels"。相反,"Tools" 查找相应的 "package"(在本例中为 "media/image1.png")和 return 该信息。如您所见,它包含属性 pkg:contentType,它为您提供文件扩展名。

<pkg:part pkg:name="/word/media/image1.png" pkg:contentType="image/png" pkg:compression="store">

请查看 this sample 是否正在执行您需要的操作。我认为你的方向是对的。

下面是一些示例代码:

async function run() {
    await Word.run(async (context) => {

        let myImages = context.document.body.inlinePictures;
        myImages.load("imageFormat");

        await context.sync();
        
        if (myImages.items.length >0)
        console.log(myImages.items[0].imageFormat);
        else
        console.log("no image found.")


    });
}

请注意,我们有一个 imageFormat 属性,问题是我们在预览 CDN 中有它。 (使用 https://appsforoffice.microsoft.com/lib/beta/hosted/office.js)。我们没有图像名称,但您可以使用替代文本来存储它。