Как конвертировать файлы Office в PDF с помощью Microsoft Graph - PullRequest
0 голосов
/ 03 октября 2018

Я ищу способ конвертировать файлы Office в PDF.Я обнаружил, что можно использовать Microsoft Graph.

Я пытаюсь загрузить конвертированный PDF с помощью Microsoft Graph из OneDrive.Я хотел бы конвертировать .docx в .pdf.

Однако, когда я отправил следующий запрос, я не получил ответ, даже если я ждал.

GET https://graph.microsoft.com/v1.0/users/{id}/drive/root:/test.docx:/content?format=pdf

Кроме того, код ошибки не возвращается.Если синтаксис неправильный, код ошибки будет возвращен, как и ожидалось.Он не вернется, только когда он верен.

Кроме того, я могу загрузить файл, если не преобразую.

GET https://graph.microsoft.com/v1.0/users/{id}/drive/root:/test.docx:/content

Мой метод неверен или мне нужны условия?Если возможно, пожалуйста, дайте мне пример кода, который вы действительно можете сделать.

 using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
            client.BaseAddress = new Uri(graphUrl);

            var result = await client.GetAsync("/v1.0/users/xxxxxxxxxxxxxxxxxxxxxxxxx/drive/root:/test.docx:/content?format=pdf");
            :

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я хотел бы уточнить немного Ответ Марка , предоставив несколько примеров для HttpClient.

Поскольку по умолчанию дляHttpClient HttpClientHandler.AllowAutoRedirect свойство установлено на True, нет необходимости явно следовать заголовкам перенаправления HTTP, и содержимое может быть загружено так:

using (HttpClient client = new HttpClient())
{
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
     client.BaseAddress = new Uri("https://graph.microsoft.com");

     var response = await client.GetAsync($"/v1.0/drives/{driveId}/root:/{filePath}:/content?format=pdf");

      //save content into file 
      using (var file = System.IO.File.Create(fileName))
      { 
           var stream = await response.Content.ReadAsStreamAsync(); 
           await stream.CopyToAsync(file); 
      }
}

В случае, еслиследовать перенаправлению HTTP отключено , чтобы загрузить преобразованный файл, ваше приложение должно следовать заголовку Location в ответе, как показано ниже:

var handler = new HttpClientHandler()
{
    AllowAutoRedirect = false
};

using (HttpClient client = new HttpClient(handler))
{
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
     client.BaseAddress = new Uri("https://graph.microsoft.com");

     var response = await client.GetAsync($"/v1.0/drives/{driveId}/root:/{filePath}:/content?format=pdf");
     if(response.StatusCode == HttpStatusCode.Redirect)
     {
           response = await client.GetAsync(response.Headers.Location); //get the actual content
     }

      //save content into file 
      using (var file = System.IO.File.Create(fileName))
      { 
           var stream = await response.Content.ReadAsStreamAsync(); 
           await stream.CopyToAsync(file); 
      }
}
0 голосов
/ 03 октября 2018

API не возвращает преобразованный контент напрямую, он возвращает ссылку на преобразованный файл.Из документации :

Возвращает ответ 302 Found, перенаправляющий на предварительно загруженный URL-адрес загрузки для преобразованного файла.

Чтобы загрузить преобразованный файл,Ваше приложение должно следовать заголовку Location в ответе.

Предварительно проверенные URL-адреса действительны только в течение короткого периода времени (несколько минут) и не требуют заголовка авторизации для доступа.

Вам необходимо захватить 302 и сделать второй вызов URI в заголовке Location, чтобы загрузить преобразованный файл.

...