5

我有一个托管在http://test.com/mypdf.pdf中的 PDF 。

如何将 PDF 转换为 PDF Stream,然后使用此Stream转换回 PDF。

我尝试了以下但有一个异常(见图):

private static Stream ConvertToStream(string fileUrl)
{
    HttpWebResponse aResponse = null;
    try
    {
        HttpWebRequest aRequest = (HttpWebRequest)WebRequest.Create(fileUrl);
        aResponse = (HttpWebResponse)aRequest.GetResponse();
    }
    catch (Exception ex)
    {

    }

    return aResponse.GetResponseStream();
}

在此处输入图像描述

4

2 回答 2

7

这将起作用:

private static Stream ConvertToStream(string fileUrl)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileUrl);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    try {
        MemoryStream mem = new MemoryStream();
        Stream stream = response.GetResponseStream();

        stream.CopyTo(mem,4096);

        return mem;
    } finally {
        response.Close();
    }
}

但是,您对返回的内存流的生命周期负全部责任。

更好的方法是:

private static void ConvertToStream(string fileUrl, Stream stream)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileUrl);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    try {
        Stream response_stream = response.GetResponseStream();

        response_stream.CopyTo(stream,4096);
    } finally {
        response.Close();
    }
}

然后,您可以执行以下操作:

using (MemoryStream mem = new MemoryStream()) {
    ConvertToStream('http://www.example.com/',mem);
    mem.Seek(0,SeekOrigin.Begin);

    ... Do something else ...
}

您也可以直接返回响应流,但您必须检查其生命周期,释放响应可能会释放流,因此会释放内存副本。

于 2012-11-01T11:57:57.020 回答
5

你可能想看看WebClient.DownloadFile

您给它一个 URL 和本地文件名,它会将文件直接保存到磁盘。可能会为您节省一两步。

您也可以尝试WebClient.DownloadData将文件保存到 in-memory byte[]

编辑

您没有指定要将文件发布到的 Web 服务的协议。最简单的形式(RESTful)就是将文件发布到另一个 URL 的数据。这是您将如何做到的。

using (WebClient wc = new WebClient())
{
    // copy data to byte[]
    byte[] data = wc.DownloadData("http://somesite.com/your.pdf");

    // POST data to another URL
    wc.Headers.Add("Content-Type","application/pdf");
    wc.UploadData("http://anothersite.com/your.pdf", data);
}

如果您使用的是 SOAP,则必须将文件转换为 Base64 字符串,但希望您使用的是生成的客户端,它会为您处理这些问题。如果您可以详细说明您将文件发送到的网络服务类型,我可能会提供更多信息..

于 2012-11-01T12:00:24.973 回答