Typescript 获取Word文档中的所有图像

Typescript 获取Word文档中的所有图像,typescript,ms-word,office-js,word-addins,apps-for-office,Typescript,Ms Word,Office Js,Word Addins,Apps For Office,我试图在Word文档中获取一组图像。本页面的文档:字面上是示例的剪切粘贴,并没有实际显示如何获取图像-仅显示第一个图像 每个图像我需要以下内容: 数据 任何形式都可以。我看到有一个getBase64ImageSrc方法- 这就行了 文件名 没有文件名是好的-我可以看到API没有它-我可以用alt文本或image_{n}构建它,其中{n}是图像索引,但我看不到获得扩展名的方法-这在数据中是作为data:image/jpeg;布拉布拉赫???我不认识医生 没有这种级别的信息 到目前为止,我有以下

我试图在Word文档中获取一组图像。本页面的文档:字面上是示例的剪切粘贴,并没有实际显示如何获取图像-仅显示第一个图像

每个图像我需要以下内容:

  • 数据
    任何形式都可以。我看到有一个
    getBase64ImageSrc
    方法- 这就行了
  • 文件名
    没有文件名是好的-我可以看到API没有它-我可以用alt文本或
    image_{n}
    构建它,其中{n}是图像索引,但我看不到获得扩展名的方法-这在数据中是作为
    data:image/jpeg;布拉布拉赫
    ???我不认识医生 没有这种级别的信息
到目前为止,我有以下代码,但我真的不确定它是否能工作:

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));
我在这里使用一些自定义帮助程序,它们执行以下操作:

  • 字符串。isNullOrEmpty
    如果字符串为null或空,则返回true,否则返回false
  • Path.toFriendlyUrl
    返回字符串,其中包含转换为
    -
    的空格以及一些其他改进

我目前的方法正确吗?

“正确”才是有效的。。。我可以解决一个特定的问题:获取图像类型——您称之为“文件名”。因为这有点长,答案是:你可以,但你必须为此努力一点

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

对象模型(无论是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”
的元素

如您所见,文件类型在此处可用。如果您使用标准的XML工具来解析XML字符串,您可以获得如下信息

使用标准XML技术的另一种方法是使用标准的Microsoft Open XML SDK(C#或VB.NET)或OpenXMLSDK for JavaScript()分析OpenXML一词。在这种情况下,您无法直接读取“rels”。相反,“工具”查找相应的“包”(在本例中为“media/image1.png”)并返回该信息。如您所见,这包括属性pkg:contentType,它为您提供了文件扩展名

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

“正确”才有效。。。我可以解决一个特定的问题:获取图像类型——您称之为“文件名”。因为这有点长,答案是:你可以,但你必须为此努力一点

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

对象模型(无论是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”
的元素

如您所见,文件类型在此处可用。如果您使用标准的XML工具来解析XML字符串,您可以获得如下信息

使用标准XML技术的另一种方法是使用标准的Microsoft Open XML SDK(C#或VB.NET)或OpenXMLSDK for JavaScript()分析OpenXML一词。在这种情况下,您无法直接读取“rels”。相反,“工具”查找相应的“包”(在本例中为“media/image1.png”)并返回该信息。如您所见,这包括属性pkg:contentType,它为您提供了文件扩展名

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

请查看正在做您需要的事情的t。我认为你的思路是对的

以下是一些示例代码:

异步函数运行(){
等待Word.run(异步(上下文)=>{
让myImages=context.document.body.inlinePictures;
加载(“imageFormat”);
wait context.sync();
如果(myImages.items.length>0)
console.log(myImages.items[0].imageFormat);
其他的
log(“找不到图像”)
});
}
请查看正在做您需要的事情的t。我认为你的思路是对的

以下是一些示例代码:

异步函数运行(){
等待Word.run(异步(上下文)=>{
让myImages=context.document.body.inlinePictures;
加载(“imageFormat”);
wait context.sync();
如果(myImages.items.length>0)
console.log(myImages.items[0].imageFormat);
其他的
log(“找不到图像”)
});

}
谢谢您的回复,辛迪。从您的回复来看,我认为我最好只发送文档服务器端,并使用我已经用于其他内容的文档解析技术。我只是希望有一种方法可以完全使用office.js在客户端完成这项工作。我会把这个打开几天,看看是否有其他人有一些