获取Word文档中的所有图片
Get all images in a Word document
我正在尝试获取 Word 文档中的图像集。此页面的文档:https://dev.office.com/reference/add-ins/word/inlinepicture 字面意思是示例的剪切和粘贴,实际上并未显示如何获取图像 - 仅显示第一个图像。
每张图片我需要以下内容:
- 数据
任何格式都可以。我看到有一个 getBase64ImageSrc
方法 -
这样就可以了。
- 文件名
没有文件名是好的 - 我可以看到 API 没有它 - 我可以用替代文本或只是 image_{n}
来构建它,其中 {n} 是图像索引 ,但我看不到获取扩展名的方法 - 这是数据中的 data:image/jpeg;blahblah
吗???我不知道文档
没有这个级别的信息。
到目前为止我有以下代码,但我真的不确定它是否有效:
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));
我在这里使用了一些自定义助手,它们执行以下操作:
- Strings.isNullOrEmpty
Return 如果字符串为 null 或空则为真,否则为假
- Path.toFriendlyUrl
Returns 带空格的字符串转换为 -
和其他一些改进
我目前的做法是否正确?
"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)。我们没有图像名称,但您可以使用替代文本来存储它。
我正在尝试获取 Word 文档中的图像集。此页面的文档:https://dev.office.com/reference/add-ins/word/inlinepicture 字面意思是示例的剪切和粘贴,实际上并未显示如何获取图像 - 仅显示第一个图像。
每张图片我需要以下内容:
- 数据
任何格式都可以。我看到有一个getBase64ImageSrc
方法 - 这样就可以了。 - 文件名
没有文件名是好的 - 我可以看到 API 没有它 - 我可以用替代文本或只是image_{n}
来构建它,其中 {n} 是图像索引 ,但我看不到获取扩展名的方法 - 这是数据中的data:image/jpeg;blahblah
吗???我不知道文档 没有这个级别的信息。
到目前为止我有以下代码,但我真的不确定它是否有效:
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));
我在这里使用了一些自定义助手,它们执行以下操作:
- Strings.isNullOrEmpty
Return 如果字符串为 null 或空则为真,否则为假 - Path.toFriendlyUrl
Returns 带空格的字符串转换为-
和其他一些改进
我目前的做法是否正确?
"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)。我们没有图像名称,但您可以使用替代文本来存储它。