Экспорт PPTX в PDF в Sharepoint Online с помощью PnP js и .pdfConversionUrl - PullRequest
0 голосов
/ 06 мая 2020

Мы взаимодействуем с библиотекой документов Sharepoint Online через структуру PnP js и с помощью надстройки приложения Sharepoint (по той или иной причине мы не можем использовать Graph API в это время)

Наша надстройка полностью контролирует наш сайт:

<AppPermissionRequests AllowAppOnlyPolicy="true">
    <AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl" />
</AppPermissionRequests>

Мы можем выполнять практически все операции, которые захотим - создавать / удалять папки, добавлять файлы, копировать файлы и т. д. c. Единственное, на чем мы застряли, - это экспорт файла .pptx, который был загружен в Sharepoint, в файл .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}}

Идея состоит в том, чтобы сделать запрос GET на этот URL-адрес, а ответ будет содержать поток файла PDF, который мы затем можем загрузить в Sharepoint. Процесс в общих чертах описан командой PnP в этом видео на YouTube.

Однако, когда я делаю GET-запрос на этот URL-адрес через node-fetch или непосредственно в браузере, я получаю эту ошибку message:

{
    "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, чтобы «Разрешить приложения, которые не используют современную аутентификацию». Мы сделали это, но по-прежнему получаем то же сообщение об ошибке.

Если кто-то пробовал это раньше, сообщите нам, как мы можем решить эту ошибку. Спасибо!

1 Ответ

0 голосов
/ 06 мая 2020

Обнаружена моя проблема - мой запрос 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>`;

Затем используйте .spItemUrl, который входит в ответ внутри элементов ListData.Row

Надеюсь, это кому-то поможет

...