【问题标题】:How to convert a WebService Response to a PDF?如何将 WebService 响应转换为 PDF?
【发布时间】:2015-06-07 09:19:30
【问题描述】:

简介

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

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

他们提供与他们的 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();
                    }
                }
            }

【问题讨论】:

  • 什么是“响应”对象?不要在任何地方看到它的定义。
  • 我认为您在这里错过的是(来自网站):“在一个名为 europass-xml 的参数中。”您正在传递一个有效的 XML,只是不在预期的容器中。这就是为什么他们使用名为 europass-xml 的文本区域将 xml 直接发布到他们的网站。
  • 您好@JunaidKirkire,响应对象与页面对象相关联。此对象允许您向客户端发送 HTTP 响应数据并包含有关该响应的信息。 link。我正在使用 ASP.NET 4.5 框架
  • @LocEngineer 但如果出现问题,我怎么能收到 OK 响应?欢呼
  • 您发送了正确的回复。但是当他们查询容器“europass-xml”时,它是空的 => 因此你会收到一个空的 pdf。

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


【解决方案1】:

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

【讨论】:

  • 您好@LukeH,这是一次令人难以置信的罢工!非常感谢! :)
【解决方案2】:

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

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

【讨论】:

  • 你好@BMaximus,我使用的文件路径是获取xmlcontent,然后像POST请求一样发送。你能更具体点吗?干杯
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2012-02-08
  • 2021-08-30
  • 2023-02-08
相关资源
最近更新 更多