Ошибка с методом getFileAsync () на рабочем столе Word - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть надстройка для Word, которая получает весь документ с помощью getFileAsync () из API Office Javascript, преобразует его в хэш и сохраняет его в базе данных для будущего сравнения.

Недавно я столкнулся с проблемой, связанной с этим, когда вызов функции на настольной платформе каким-то образом изменяет документ.Я связался с инженером службы поддержки Microsoft и определил проблему как ошибку.Инженер службы поддержки отправил эту ошибку, открыв проблему в репозитории OfficeDev / office-js.Вот ссылка на проблему: https://github.com/OfficeDev/office-js/issues/298

После вызова функции getFileAsync в настольном приложении документ, похоже, изменяется, не делая ничего другого.Вот код, который был использован:

verifyDocument(callback){
  let method = 'getDocumentByFile'
  
  var promiseGetFileAsync = new Promise((resolve, reject) => {

      Office.context.document.getFilePropertiesAsync(function (asyncResult) {
      let fileUrl = asyncResult.value.url;
      let fileType = localStorage.getItem("Host");

      if (!fileUrl) {
        reject("Please save the file first")
      } else {

        Office.context.document.getFileAsync('compressed',
          {},
          function (result) {

            if (result.status == Office.AsyncResultStatus.Succeeded) {

              var myFile = result.value;
        
              var state = {
                file: myFile,
                counter: 0,
                sliceCount: myFile.sliceCount
              };
              state.file.getSliceAsync(state.counter, function (result) {
                if (result.status == Office.AsyncResultStatus.Succeeded) {
  
                  var slice = result.value;
                  var data = slice.data;
                  var payload

                  if (data) {

                    payload = {
                      method : method,
                      data: data,
                      fileType: fileType
                    }
                    resolve(payload);
                  }

                  state.counter++;
                  if (state.counter > state.sliceCount) {

                  }
                  else {
                    state.file.closeAsync();
                  }

                }

              });
            }
            else {
              reject(result.error)
            }
          });
      }
    });
  })

  promiseGetFileAsync.then((data: any) => {

    let myHeaders = new Headers();
    myHeaders.append('Authorization', 'Bearer ' + localStorage.getItem('token'));
    let options = new RequestOptions({ headers: myHeaders });
      var file:any = new Blob([new Uint8Array(data.data)], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
      let formData: FormData = new FormData();
      formData.append('method', data.method);
      formData.append('document', file);
  
      this.http.post('Link to our API receiver', formData, options)
        .map(res => res.json())
        .subscribe(response => {
          callback(response);
        }
      )
  });

Этот код получает весь документ и отправляет его в виде большого двоичного объекта нашему получателю API для сравнения.

Метод сравнения отправляемых документов ив базе есть хеш через sha256.API преобразует полученный документ в хэш sha256 и сравнивает его со всеми хешами в базе данных.Код также служит «обновлением» хэша, который уже находится в базе данных, с другой ссылкой API, которая все еще преобразует документ в хэш sha256 и помещает этот определенный хэш в базу данных для сравнения в будущем.Это работает без проблем на Word Online;но при открытии документа в Word Office 365 происходит сбой.После вызова функции API не может найти хеш документа в базе данных и выдаст ошибку.Это потому, что функция отправляет другой документ получателю.При выходе из приложения Word мы получаем сообщение:

Диалоговое окно

Мы можем заключить, что в этом диалоговом окне что-то изменилось в документе,Согласие сохранить документ и выйти из настольного приложения снова изменит документ, поскольку он был сохранен.Открытие документа в Word Online и вызов функции оттуда приведет к неудачной проверке при сравнении хэша документа с данными в базе данных.

Для краткости, функция getFileAsync в настольном приложении работает по-разномупо сравнению с Word Online, поскольку он возвращает документ с тем же содержимым, но с другими метаданными.

Кто-нибудь знает, почему это происходит только в приложении для настольного компьютера, а не в Word Online?Есть ли какие-либо обходные пути для этой проблемы?

ОБНОВЛЕНИЕ:

По-видимому, этот вопрос был закрыт назначенным ему премьер-министром, предлагая getOoxml () метод из Word API в качестве обходного пути.Я попытался повторить надстройку с кодом из документации и обнаружил, что значение переменной bodyOOXML также изменяется при вызове функции.

PM заявил, что получает элемент документа из bodyOOXML исравнить его с существующим в базе данных;но при ручной проверке я обнаружил, что элемент <w:p w:rsidR="00000000" w:rsidRDefault="******"> всегда имеет другое значение для w: rsidRDefault после каждого вызова функции.Это всегда приведет к отрицательному результату при сравнении.Более того, я думаю, что элемент документа из выходных данных берет только текст из документа, исключая изображения на нем.Вот элемент w: document из значения bodyOOXML:

<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14"><w:body><w:p w:rsidR="00000000" w:rsidRDefault="005D6ED5"><w:r><w:t>Test Word</w:t></w:r><w:r><w:rPr><w:noProof /></w:rPr><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="216A5B6F" wp14:editId="50917A19"><wp:extent cx="1096645" cy="1096645" /><wp:effectExtent l="0" t="0" r="8255" b="8255" /><wp:docPr id="1617038684" name="picture" /><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1" /></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="picture" /><pic:cNvPicPr /></pic:nvPicPr><pic:blipFill><a:blip r:embed="rId4"><a:extLst><a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"><a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0" /></a:ext></a:extLst></a:blip><a:stretch><a:fillRect /></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x="0" y="0" /><a:ext cx="1096645" cy="1096645" /></a:xfrm><a:prstGeom prst="rect"><a:avLst /></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p><w:sectPr w:rsidR="00000000"><w:pgSz w:w="12240" w:h="15840" /><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0" /><w:cols w:space="720" /></w:sectPr></w:body></w:document>

Вот ссылка для загрузки файлов XML для прямого сравнения.

Я все еще в тупике с тем, чтоделай на этом.Рекомендация имеет большую проблему, поскольку теперь она затрагивает Word Online, кроме настольных версий.Я надеюсь, что любой может помочь мне в этом.

...