c# - 如何将 Web 服务响应转换为 PDF?

标签 c# asp.net xml web-services

简介

我正在尝试将 Europass Webservice 与我目前正在开发的网站集成。

此 Web 服务允许您通过 XML 或 JSON 文件获取 PDF 或 Word 简历。

他们提供与他们的 WS 和示例 XML 通信的信息 (here) ,但您可以自己做,因为您尊重他们的模式。

为确保 xml 可以使用远程上传服务,并在他们的网站上查看从您的 XML 生成的简历。

我正在使用 REST 服务,更具体地说是 XML 到 PDF CV

我的疑问

我的问题是我可以与 Web 服务通信并且我也得到了 OK 响应(太棒了!),但是在下载 PDF 时它是空白的。

我在这里错过了什么?你们能指导我吗?

要重现此内容,请复制下面的代码并添加此 xml 的内容到 xmlcontent 路径中的文件。

代码

        //POST
        string xmlContent = File.ReadAllText("D:\\Documents\\CV.xml");
        string URL = "https://europass.cedefop.europa.eu/rest/v1/document/to/pdf-cv";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.Method = "POST";
        request.ContentType = "application/xml";
        using (Stream webStream = request.GetRequestStream())
        using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.UTF8))
        {
            requestWriter.Write(xmlContent);
        }

        //RESPONSE
        try
        {
            WebResponse webResponse = request.GetResponse();
            using (Stream webStream = webResponse.GetResponseStream())
            {
                if (webStream != null)
                {
                    using (StreamReader responseReader = new StreamReader(webStream))
                    {
                        string response = responseReader.ReadToEnd();
                        byte[] byteResponse = Encoding.UTF8.GetBytes (response);
                        Response.Clear();
                        Response.Buffer = true;
                        Response.ContentType = "application/pdf";
                        Response.AddHeader("content-disposition", "attachment;filename=test.pdf"); // Save file         
                        Response.AddHeader("Content-Length", byteResponse.Length.ToString());
                        Response.Charset = "";
                        Response.Cache.SetCacheability(HttpCacheability.NoCache);
                        Response.BinaryWrite(byteResponse);
                        Response.End();
                    }
                }
            }

最佳答案

您从网络服务调用收到的响应正文包含 PDF 的原始字节。

通过 StreamReader 运行这些字节您将它们视为文本,然后尝试使用 GetBytes 将该“文本”转换回字节数组.我怀疑这些步骤正在破坏您的数据。

您应该能够将 PDF 字节直接复制到您自己的 output stream :

// note: this code is completely untested, i don't even know whether it compiles
using (var webResponse = request.GetResponse())
using (var webStream = webResponse.GetResponseStream())
{
    if (webStream != null)
    {
        Response.Clear();
        Response.Buffer = true;
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment; filename=\"test.pdf\"");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        webStream.CopyTo(Response.OutputStream);
        Response.Flush();
        Response.End();
    }
}

关于c# - 如何将 Web 服务响应转换为 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29412620/

相关文章:

php - 如何创建 API

xml - 使用 Powershell 忽略 XML 文档中的命名空间

c# - 使用特殊类的多个 DisplayMember

C# MySQL SQL 更新/插入

c# - 没有给出对应于 x 的所需形式参数的参数

c# - 如何在一个 Windows 窗体面板中的一个 Csharp 面板中使用多个窗体?

asp.net - 'response.clear()' 是否删除内容和标题?

c# - 工具提示文本作为 ASP.Net 下拉列表中的选定值

c# - xUnit - 显示理论成员数据的测试名称 (TestCase)

c# - 如何判断一个字符串是不是xml?