我正在寻找一种将Office文件转换为PDF的方法。 我发现可以使用Microsoft Graph。
我正在尝试使用Microsoft Graph从OneDrive下载转换后的PDF。 我想将.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");
:
答案 0 :(得分:1)
API不会直接返回转换后的内容,而是会返回指向转换后文件的链接。来自documentation:
返回
302 Found
响应,重定向到已转换文件的预先认证的下载URL。要下载转换后的文件,您的应用必须遵循响应中的
Location
标头。预先认证的URL仅在短时间内(几分钟)有效,不需要访问Authorization标头。
您需要捕获302
并在Location
标头中对URI进行第二次调用才能下载转换后的文件。
答案 1 :(得分:1)
我想通过提供Marc's answer的一些示例来详细说明HttpClient
。
由于HttpClient
HttpClientHandler.AllowAutoRedirect
property的默认 设置为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);
}
}
如果禁用了 ,则要下载转换后的文件,您的应用必须遵循响应中的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);
}
}