2015-04-02 118 views
2

簡介如何將WebService響應轉換爲PDF?

我正在嘗試將Europass Webservice與我目前正在開發的網站進行集成。

此WebService允許您通過XML或JSON文件獲取PDF或Word簡歷。

他們提供信息與他們的WS和樣本XML (here)溝通,但你可以自己做,因爲你尊重他們的模式。

爲了確保xml可以使用遠程上傳服務,並在他們的網站上查看來自您的XML的簡歷。

我使用REST服務,更具體的XML PDF CV

MY析疑

我的問題是,我可以與Web服務comunicate,我也得到一個OK應答(大!),但是當下載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(); 
        } 
       } 
      } 
+0

什麼是「響應」對象?沒有看到它在任何地方定義。 – JunaidKirkire 2015-04-02 12:20:51

+0

我想你在這裏錯過的是這個(來自網站):「在一個名爲europass-xml的參數中。」 您正在傳遞一個有效的XML,但不在預期的容器中。這就是爲什麼他們使用名爲europass-xml的textarea將xml直接發佈到他們的網站。 – LocEngineer 2015-04-02 12:28:37

+0

Hello @JunaidKirkire,響應對象與頁面對象相關聯。此對象允許您將HTTP響應數據發送到客戶端,幷包含有關該響應的信息。 [鏈接](https://msdn.microsoft.com/en-us/library/system.web.ui.page.response%28v=vs.110%29.aspx)。我正在使用ASP.NET 4.5 Framework – Nelssen 2015-04-02 12:33:05

回答

3

您收到來自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(); 
    } 
} 
+0

你好@LukeH,這是一個令人難以置信的罷工!非常感謝你! :) – Nelssen 2015-04-02 13:23:12

0

您提供服務器

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

你好@BMaximus,我使用的文件路徑是獲取xmlcontent,然後在POST請求中發送。你能更具體嗎?乾杯 – Nelssen 2015-04-02 13:10:09