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

时间:2015-04-02 12:09:09

标签: c# asp.net xml web-services

引言

我试图将Europass Webservice与我目前正在开发的网站整合。

此WebService允许您通过XML或JSON文件获取PDF或Word CV。

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

要确保xml正常,请使用远程上传服务,并在其网站上查看XML中生成的简历。

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

MY DOUBT

我的问题是我可以通过Web服务进行通信,并且我也得到了一个好的响应(太棒了!),但是在下载PDF时它全部是空白的。

我在这里想念的是什么?你能指导我吗?

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

CODE

        //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();
                    }
                }
            }

2 个答案:

答案 0 :(得分:3)

您从webservice调用中收到的响应正文包含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();
    }
}

答案 1 :(得分:0)

您在服务器上提供文件路径

 WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
 return File.OpenRead(downloadFilePath);