Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将API、新API版本docx转换为PDF_C#_Pdf_Convertapi - Fatal编程技术网

C# 将API、新API版本docx转换为PDF

C# 将API、新API版本docx转换为PDF,c#,pdf,convertapi,C#,Pdf,Convertapi,我正在使用convertapi将docx转换为PDF。对于旧的API版本,一切都很好,但我正在尝试迁移到新的API版本,当我打开PDF时,它不是有效的文档,也不会打开。不确定我做错了什么,也许是编码方面的问题 我从convertapi得到的响应是一个JSON,带有文件名、文件大小和文件数据。可能需要处理此文件数据才能创建有效的PDF文件?如果我只是将数据写入一个文件,它就不起作用了 public string ConvertReportToPDF(string fileName) { s

我正在使用convertapi将docx转换为PDF。对于旧的API版本,一切都很好,但我正在尝试迁移到新的API版本,当我打开PDF时,它不是有效的文档,也不会打开。不确定我做错了什么,也许是编码方面的问题

我从convertapi得到的响应是一个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;
}
public string ConvertReportToPDF(字符串文件名)
{
字符串resultFileName=“”;
key=“xxxxx”;
var requestContent=new MultipartFormDataContent();
var fileStream=System.IO.File.OpenRead(文件名);
var stream=新的流内容(fileStream);
Add(流,“文件”,fileStream.Name);
var response=new HttpClient().PostAsync(“https://v2.convertapi.com/docx/to/pdf?Secret=“+键,请求内容)。结果;
FileReportResponse ResponsedSerialized=JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
var path=SERVER\u TEMP\u path+“\\”+responsedSerialized.Files.First().FileName;
System.IO.File.WriteAllText(路径,responsedSerialized.Files.First().FileData);
返回responseDeserialized.Files.First().FileName;
}

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;
}
public string ConvertReportToPDF(字符串文件名)
{
字符串resultFileName=“”;
key=“xxxxx”;
var requestContent=new MultipartFormDataContent();
var fileStream=System.IO.File.OpenRead(文件名);
var stream=新的流内容(fileStream);
Add(流,“文件”,fileStream.Name);
var response=new HttpClient().PostAsync(“https://v2.convertapi.com/docx/to/pdf?Secret=“+键,请求内容)。结果;
FileReportResponse ResponsedSerialized=JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
var path=SERVER\u TEMP\u path+“\\”+responsedSerialized.Files.First().FileName;
System.IO.File.WriteAllText(路径,Convert.FromBase64String(responsedSerialized.Files.First().FileData));
返回responseDeserialized.Files.First().FileName;
}

既然可以使用二进制响应,为什么要在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());
              }
  }
}

你能试一下提供的样品吗?是的,我试过提供的样品,但结果是一样的。PDF无效,无法打开。这在旧版本中有效,而在新API版本中,您不能直接在文件上写入所有字节。您需要反序列化响应并获取生成PDF文档所需的文件数据。@olirx请仔细阅读上面的描述。它说,如果我们添加“accept”、“application/octetstream”,则响应将从JSON切换为二进制。所以,您得到的二进制文件作为响应,而不需要解码它,只要保存,它就工作了!我刚刚尝试过,你是对的,在响应中添加“accept”、“application/octetstream”只返回文档字节。令人惊叹的!谢谢