Я сделал скрипт для предварительного просмотра документов в формате PDF, включая отслеживаемые изменения, которые вы можете использовать в своих формах. Суть внизу
В Office Web Apps есть несколько полезных функций, две из которых — предварительный просмотр документа и немного скрытая функция "Печать в PDF".
Да, Office Web Apps автоматически создает PDF-копию документа. каждый документ, который вы храните в SharePoint. И это мгновенно!
Я хотел просмотреть свои документы в Editform и Viewform и начал с того, что просто вставил WOPIframe.aspx в iFrame. URL-адрес будет выглядеть примерно так:
[mytenant].sharepoint.com/_layouts/15/WopiFrame.aspx?sourcedoc={GUID}&action=interactivepreview
Это прекрасно работает, пока вы не захотите включить отслеживаемые изменения.
В SharePoint Online уже есть способ отобразить это — он называется «Режим специальных возможностей» (видите кнопку наверху?). Однако это устанавливает файл cookie, поэтому все ваши предварительные просмотры теперь находятся в режиме специальных возможностей, пока вы их не отключите, что немного раздражает и бесполезно в маленьком окне предварительного просмотра.
Кроме того, он не работает в помещении, для чего я его изначально и делал.
Получите этот токен доступа WOPI!
Фактический PDF-файл, который извлекается, когда вы нажимаете «Печать в PDF» или «Режим специальных возможностей», фактически находится на вашем сервере Office Web Apps.
Верно, Cross Origin. 😑Эх…
НО! С помощью передовой технологии, известной как iframe, нам не нужно беспокоиться ни о какой чепухе того же происхождения 🙌 Ура!
Чтобы получить этот PDF, вам нужны три вещи
- Идентификатор элемента (указатель, а не идентификатор элемента списка)
- Имя хоста OWA
- Маркер доступа
Сначала получите DOM кадра wopi. Я использую fetch API, потому что он абстрагирует все, что мне не нравится в XmlHttpRequests.
fetch( `${_spPageContextInfo.siteAbsoluteUrl}/_layouts/15/WopiFrame.aspx?sourcedoc=${encodeURIComponent(docUrl)}`, {credentials:"include"})
параметр docUrl — это URL-адрес текущего документа, в форме просмотра или редактирования которого вы находитесь. Вы можете найти его в объекте WPQ2FormCtx. WPQ2FormCtx.ItemAttributes.Url дает вам FileLeafRef без веб-адреса, например. «/Documents/MyDoc.docx», поэтому вам придется собрать собственный полный URL-адрес. (Я сделал это в коде, чтобы вам не пришлось)
В wopiframe dom есть элемент ‹form› с атрибутом действия, который содержит URL-адрес сервера owa и идентификатор элемента (guid). Мы подчеркнем их «изящно». В dom также есть ввод с метким названием access_token, который содержит токен, который нам понадобится для получения преобразованного PDF-файла с сервера owa.
Теперь, когда у вас есть имя хоста owa, токен доступа и идентификатор элемента, просто красиво свяжите их в FullPdfUrl.
let FullPdfUrl = await OWAServerHost()+ "/wv/WordViewer/" + FileName + ".pdf?WOPISrc="+ await WopiSrcSite()+ _spPageContextInfo.webServerRelativeUrl+ "/_vti_bin/wopi.ashx/files/"+ await WopiItemId()+ "&access_token="+ await WopiAccessToken()+ "&type=accesspdf"
Все, что осталось сделать, это поместить его в iframe рядом с формой и вуаля!
TL;DR — Код
Примечание. Это не будет работать в IE без fetch-polyfill. Кроме того, в IE нет понятия const, let или стрелочных функций, поэтому вам, вероятно, лучше перенести все это в ES5.