使用 PnPjs 和 .pdfConversionUrl 在 Sharepoint Online 中将 PPTX 导出为 PDF
Exporting a PPTX to PDF in Sharepoint Online with PnPjs and .pdfConversionUrl
我们正在通过 PnPjs framework and by using a Sharepoint App Add-In 与 Sharepoint Online 的文档库进行交互(目前我们无法使用 Graph API)
我们的加载项可以完全控制我们的网站:
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl" />
</AppPermissionRequests>
我们几乎可以执行我们想要的所有操作 - create/delete 文件夹、添加文件、复制文件等。我们遇到的一件事是导出已上传到的 .pptx 文件从代码共享点到 .pdf 文件。
以下是我如何从文档库列表中检索 .pdfConversionUrl 以制定对 Microsoft 媒体转换服务的请求:
let options: RenderListDataOptions = RenderListDataOptions.EnableMediaTAUrls | RenderListDataOptions.ContextInfo | RenderListDataOptions.ListData | RenderListDataOptions.ListSchema;
const viewXml: string = `
<View Scope='RecursiveAll'>
<Query>
<Where>
<In>
<FieldRef Name='ID' />
<Values>
<Value Type='Counter'>{{OUR SP DOCUMENTS LIST ID}}</Value>
</Values>
</In>
</Where>
</Query>
<RowLimit>1</RowLimit>
</View>`;
const listStream = await sp.web.lists.getById({{OUR SP DOCUMENTS LIST ID}}).renderListDataAsStream({ RenderOptions: options, ViewXml: viewXml });
/*
* response contains this property:
* '.pdfConversionUrl': '{.mediaBaseUrl}/transform/pdf?provider=spo&inputFormat={.fileType}&cs={.callerStack}&docid={.spItemUrl}&{.driveAccessToken}'
* mediaBaseUrl, callerStack and driveAccessToken values are also included
*/
const pdfTransformURL = `${listStream.ListSchema['.mediaBaseUrl']}/transform/pdf?provider=spo&inputFormat=pptx&cs=${listStream.ListSchema['.callerStack']}&docid={{LINK TO THE SP PPTX FILE}}&${listStream.ListSchema['.driveAccessToken']}`;
console.log(pdfTransformURL);
这里是生成的URL:
https://northcentralus1-mediap.svc.ms/transform/pdf?provider=spo&inputFormat=pptx&cs={{OUR SP CALLER STACK}}&docid={{LINK TO OUR SP PPTX FILE}}&access_token={{OUR ACCESS TOKEN}}
当我们向 URL 发出 GET 请求时,响应将包含 PDF 文件流,然后我们可以将其上传到 Sharepoint。 The process is outlined by the PnP team in this youtube video
但是,当我通过 node-fetch 或直接在浏览器中向 URL 发出 GET 请求时,我收到此错误消息:
{
"error":
{
"code":"generalException",
"message":"Exception: The remote server returned an error: (403) Forbidden. Access+denied.+Before+opening+files+in+this+location%2c+you+must+first+browse+to+the+web+site+and+select+the+option+to+login+automatically.",
"innererror":{"code":"Web_403Forbidden"}
}
}
我们用谷歌搜索了一下,发现我们需要在 SP 管理面板中启用“允许不使用现代身份验证的应用程序”选项。我们这样做了,但仍然收到相同的错误消息。
如果有人以前尝试过此操作,请告诉我们如何解决此错误。谢谢!
发现我的问题 - 我的 CAML 查询是错误的。应该是这样的:
const viewXml: string = `
<View Scope='RecursiveAll'>
<Query>
<Where>
<In>
<FieldRef Name='ID' />
<Values>
<Value Type='Counter'>{{Document ID, NOT List Id}}</Value>
</Values>
</In>
</Where>
</Query>
<RowLimit>1</RowLimit>
</View>`;
然后,使用作为 ListData.Row 元素内部响应的一部分的 .spItemUrl
希望这对某人有所帮助
我们正在通过 PnPjs framework and by using a Sharepoint App Add-In 与 Sharepoint Online 的文档库进行交互(目前我们无法使用 Graph API)
我们的加载项可以完全控制我们的网站:
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl" />
</AppPermissionRequests>
我们几乎可以执行我们想要的所有操作 - create/delete 文件夹、添加文件、复制文件等。我们遇到的一件事是导出已上传到的 .pptx 文件从代码共享点到 .pdf 文件。
以下是我如何从文档库列表中检索 .pdfConversionUrl 以制定对 Microsoft 媒体转换服务的请求:
let options: RenderListDataOptions = RenderListDataOptions.EnableMediaTAUrls | RenderListDataOptions.ContextInfo | RenderListDataOptions.ListData | RenderListDataOptions.ListSchema;
const viewXml: string = `
<View Scope='RecursiveAll'>
<Query>
<Where>
<In>
<FieldRef Name='ID' />
<Values>
<Value Type='Counter'>{{OUR SP DOCUMENTS LIST ID}}</Value>
</Values>
</In>
</Where>
</Query>
<RowLimit>1</RowLimit>
</View>`;
const listStream = await sp.web.lists.getById({{OUR SP DOCUMENTS LIST ID}}).renderListDataAsStream({ RenderOptions: options, ViewXml: viewXml });
/*
* response contains this property:
* '.pdfConversionUrl': '{.mediaBaseUrl}/transform/pdf?provider=spo&inputFormat={.fileType}&cs={.callerStack}&docid={.spItemUrl}&{.driveAccessToken}'
* mediaBaseUrl, callerStack and driveAccessToken values are also included
*/
const pdfTransformURL = `${listStream.ListSchema['.mediaBaseUrl']}/transform/pdf?provider=spo&inputFormat=pptx&cs=${listStream.ListSchema['.callerStack']}&docid={{LINK TO THE SP PPTX FILE}}&${listStream.ListSchema['.driveAccessToken']}`;
console.log(pdfTransformURL);
这里是生成的URL:
https://northcentralus1-mediap.svc.ms/transform/pdf?provider=spo&inputFormat=pptx&cs={{OUR SP CALLER STACK}}&docid={{LINK TO OUR SP PPTX FILE}}&access_token={{OUR ACCESS TOKEN}}
当我们向 URL 发出 GET 请求时,响应将包含 PDF 文件流,然后我们可以将其上传到 Sharepoint。 The process is outlined by the PnP team in this youtube video
但是,当我通过 node-fetch 或直接在浏览器中向 URL 发出 GET 请求时,我收到此错误消息:
{
"error":
{
"code":"generalException",
"message":"Exception: The remote server returned an error: (403) Forbidden. Access+denied.+Before+opening+files+in+this+location%2c+you+must+first+browse+to+the+web+site+and+select+the+option+to+login+automatically.",
"innererror":{"code":"Web_403Forbidden"}
}
}
我们用谷歌搜索了一下,发现我们需要在 SP 管理面板中启用“允许不使用现代身份验证的应用程序”选项。我们这样做了,但仍然收到相同的错误消息。
如果有人以前尝试过此操作,请告诉我们如何解决此错误。谢谢!
发现我的问题 - 我的 CAML 查询是错误的。应该是这样的:
const viewXml: string = `
<View Scope='RecursiveAll'>
<Query>
<Where>
<In>
<FieldRef Name='ID' />
<Values>
<Value Type='Counter'>{{Document ID, NOT List Id}}</Value>
</Values>
</In>
</Where>
</Query>
<RowLimit>1</RowLimit>
</View>`;
然后,使用作为 ListData.Row 元素内部响应的一部分的 .spItemUrl
希望这对某人有所帮助