【问题标题】:How do I convert this filestream from an API to a PDF or XML file?如何将此文件流从 API 转换为 PDF 或 XML 文件?
【发布时间】:2018-07-04 04:58:45
【问题描述】:

我正在尝试使用 API 下载 PDF 或 Word 文档格式的文档。该服务仅提供有关如何构建请求 URL 的指导,我已经完成了。

API 在 url 中提供了 xml 或 json 方法,我使用的是 xml。

我已尝试获取字符串并将其解析为 XDocument:

        XDocument response;
        using (var webClient = new System.Net.WebClient())
        {
            response = XDocument.Parse(webClient.DownloadString(url));
        }
        Console.WriteLine(response);

我也尝试下载为文件:

        using (var webClient = new System.Net.WebClient())
        {
            webClient.DownloadFile(url, filepath));
        }

两者产生相同的结果:

%PDF-1.5
%µµµµ
1 0 obj
<</Type/Catalog/Pages 2 0 R/Lang(en-US) >>
endobj
2 0 obj
<</Type/Pages/Count 2/Kids[ 3 0 R 27 0 R] >>
endobj
3 0 obj
<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F4 11 0 R/F5 13 0 R/F6 21 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 18 0 R 19 0 R 20 0 R 26 0 R] /MediaBox[ 0 0 612 792] /Contents 4 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S>>
endobj
4 0 obj
<</Filter/FlateDecode/Length 6592>>
stream
xœÝ=k“Û6’ß]åÿÀOYÍžÍo2ÙrÝ8‰sÙ‡Çn²Æ2=¦­¡|ó°ãÔþøën€/‘ÐH r]¥"%ˆÝht7ú…KÎïÞ:Q™H•0#R©®xš©ä²¼{çå_ïÞùßíC~ùkRÓ“åi.›B¥Fï÷Œ‡ÏîÞùôK¸I<{y÷K2ø%ŒóTfR™'Ï.îÞÉRø,ÉRžkx•Ery>ñá_ß½óÛ"9ùwòìïwï|ÏÿÑ…J‹¼A„ñ4×r®<a,Í䮺ÈS×\¤ïáZÌ"ë6Ts•*UCd
NUÃS„ªÊ¤<.UU‘š T•9)&U¥NMª
–ʸTðû Te9rRLªò•L

还有更多这样的事情发生。这是非常奇怪的字符,我不知道如何从中解析 XML 或 PDF 文档。

【问题讨论】:

  • 你为什么要转换它?那是一个PDF。将其写入磁盘(将其命名为 foo.pdf)并双击该文件以在您的 pdf 阅读器中打开它
  • 当 API 只给我 xml 和 json 选项时,我没有意识到我正在获取一个 pdf 文件。谢谢@rene

标签: c# api file filestream


【解决方案1】:

您可以将 HttpClient 用于异步请求 Httpclient 是一个更好的选择,而不是 webclient

 public static async Task get()
    {
            HttpClient _httpClient = new HttpClient())
            string url = "https://someurl.com";
            var result = await _httpClient.GetAsync($"{url}");

            // contents to a log file
            string resultContent = await result.Content.ReadAsStringAsync();
            File.WriteAllText("D://dT.pdf", resultContent);
            // ... write to log
    }

【讨论】:

  • 你也用错了HttpClient。即使它实现了 IDisposable,它也不应该在 using 语句中。见You're Using HttpClient Wrong And It's Destabilizing Your Software。更好的选择是使用为您处理这些复杂情况的库,例如 Flurl.HttpRestSharp
  • httpclient正在使用中
  • 如果你想要@mason,请更新答案,我也会这样做,这种方法在我的情况下可以正常工作
  • 这正是我的意思——你在 using 语句中就有了。这很危险。你甚至读过我提供的链接吗?
  • @mason 现在可以了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2020-06-26
  • 1970-01-01
  • 2013-01-22
  • 2013-09-25
  • 2016-03-05
  • 2019-06-03
相关资源
最近更新 更多