【问题标题】:Convert API, new API version docx to PDF转换 API,新 API 版本 docx 为 PDF
【发布时间】:2018-02-08 03:18:35
【问题描述】:

我正在使用 Convert API 将 docx 转换为 PDF。使用旧的 API 版本一切正常,但我正在尝试迁移到新的 API 版本,当我打开 PDF 时,它不是一个有效的文档,它不会打开。不知道我做错了什么,也许是关于编码的问题?

我从 Convert API 得到的响应是带有文件名、文件大小和文件数据的 JSON。也许需要处理此文件数据以创建有效的 PDF 文件?如果我只是将该数据写入文件中,则它不起作用。

public string ConvertReportToPDF(string fileName)
{
    string resultFileName = "";
    key = "xxxxx";

    var requestContent = new MultipartFormDataContent();
    var fileStream = System.IO.File.OpenRead(fileName);
    var stream = new StreamContent(fileStream);
    requestContent.Add(stream, "File", fileStream.Name);

    var response = new HttpClient().PostAsync("https://v2.convertapi.com/docx/to/pdf?Secret=" + key, requestContent).Result;
    FileReportResponse responseDeserialized = JsonConvert.DeserializeObject<FileReportResponse>(response.Content.ReadAsStringAsync().Result);

    var path = SERVER_TEMP_PATH + "\\" + responseDeserialized.Files.First().FileName;
    System.IO.File.WriteAllText(path, responseDeserialized.Files.First().FileData);

    return responseDeserialized.Files.First().FileName;
}

【问题讨论】:

  • 你可以试试convertapi.com/docx-to-pdf提供的示例
  • 是的,我尝试了提供的示例,但结果是一样的。 PDF 无效,无法打开。

标签: c# pdf convertapi


【解决方案1】:

JSON 中的文件数据是 Base64 编码的,在写入文件之前对其进行解码。

public string ConvertReportToPDF(string fileName)
{
    string resultFileName = "";
    key = "xxxxx";

    var requestContent = new MultipartFormDataContent();
    var fileStream = System.IO.File.OpenRead(fileName);
    var stream = new StreamContent(fileStream);
    requestContent.Add(stream, "File", fileStream.Name);

    var response = new HttpClient().PostAsync("https://v2.convertapi.com/docx/to/pdf?Secret=" + key, requestContent).Result;
    FileReportResponse responseDeserialized = JsonConvert.DeserializeObject<FileReportResponse>(response.Content.ReadAsStringAsync().Result);

    var path = SERVER_TEMP_PATH + "\\" + responseDeserialized.Files.First().FileName;
    System.IO.File.WriteAllText(path, Convert.FromBase64String(responseDeserialized.Files.First().FileData));

    return responseDeserialized.Files.First().FileName;
}

【讨论】:

    【解决方案2】:

    当您可以使用二进制响应时,为什么要在 C# 中使用 JSON 响应。响应会更小,无需解码。要更改响应类型,您需要在请求中添加 accept=application/octet-stream 标头以请求来自服务器的二进制响应。整个代码看起来像

    using System;
    using System.Net;
    using System.IO;
    
    class MainClass {
      public static void Main (string[] args) {
                const string fileToConvert = "test.docx";
                const string fileToSave = "test.pdf";           
                const string Secret="";
    
                if (string.IsNullOrEmpty(Secret))
                  Console.WriteLine("The secret is missing, get one for free at https://www.convertapi.com/a");
                else
                  try
                  {
                      Console.WriteLine("Please wait, converting!");
                      using (var client = new WebClient())
                      {
                          client.Headers.Add("accept", "application/octet-stream");
                          var resultFile = client.UploadFile(new Uri("http://v2.convertapi.com/docx/to/pdf?Secret=" + Secret), fileToConvert); 
                          File.WriteAllBytes(fileToSave, resultFile );
                          Console.WriteLine("File converted successfully");
                      }
                  }
                  catch (WebException e)
                  {
                      Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
                      Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
                      Console.WriteLine("Body : {0}", new StreamReader(e.Response.GetResponseStream()).ReadToEnd());
                  }
      }
    }
    

    【讨论】:

    • 这在旧版本中有效,使用新的 API 版本,您不能直接将所有字节写入文件。您将需要反序列化响应并获取生成 PDF 文档所需的文件数据。
    • @olirx 请仔细阅读以上描述。它说如果我们添加“accept”、“application/octet-stream”,则响应从 JSON 切换到 Binary。因此,您无需解码即可获得二进制文件作为响应,只需保存即可!
    • 我刚试过,你是对的,在响应中添加“accept”、“application/octet-stream”只会将文档作为字节返回。惊人的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多