Azure Function使用OpenXML读取PPTX报错:Could not find document
解决Azure Functions Blob Trigger中OpenXML SDK的"Could not find document"错误
你遇到的问题核心在于错误地将Blob的二进制流读取为字符串,然后把这个字符串当作文件路径传给了PresentationDocument.Open()方法——而这个方法的string参数需要的是本地文件系统的路径,不是文件内容的字符串,自然会找不到文档。
下面是具体的修正方案:
1. 修正Run方法与OpenXML调用逻辑
不需要把Blob的Stream转换成字符串,直接使用传入的myBlob Stream即可。修改后的代码如下:
using System; using System.IO; using Microsoft.Azure; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; using DocumentFormat.OpenXml.Presentation; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml; public static void Run(Stream myBlob, string name, TraceWriter log) { // 确保Stream指针回到起始位置(避免因某些操作导致位置偏移) myBlob.Position = 0; int numberofSlides = CountSlides(myBlob); log.Info($"Number of slides in {name} = {numberofSlides}"); } // 修改方法参数为Stream,直接操作Blob的流 public static int CountSlides(Stream presentationStream) { using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationStream, false)) { return CountSlides(presentationDocument); } } public static int CountSlides(PresentationDocument presentationDocument) { if (presentationDocument == null) { throw new ArgumentNullException("presentationDocument"); } int slidesCount = 0; PresentationPart presentationPart = presentationDocument.PresentationPart; if (presentationPart != null) { slidesCount = presentationPart.SlideParts.Count(); } return slidesCount; }
2. 清理project.json中的冗余依赖
你的依赖里同时包含了Open-XML-SDK(2.7.2)和DocumentFormat.OpenXml(2.8.1),这两个包是同一SDK的不同版本分支(DocumentFormat.OpenXml是官方后续维护的包),保留一个即可。建议修改为:
"frameworks": { "net46": { "dependencies": { "WindowsAzure.Storage": "7.0.0", "DocumentFormat.OpenXml": "2.8.1" } } }
错误原因说明
原来的代码中,你用StreamReader.ReadToEnd()把PPT的二进制内容读取成了字符串,然后把这个字符串传给PresentationDocument.Open()——这个方法当接收string参数时,会去本地文件系统查找对应路径的文件,但你的字符串是PPT的二进制内容(乱码形式),自然找不到对应的文件,所以抛出了"Could not find document"的错误。直接使用Blob的Stream就能让OpenXML SDK正确解析PPT内容。
内容的提问来源于stack exchange,提问作者Artem Averin
相关产品推荐
相关产品推荐

