【问题标题】:convert pdf to stream from url将 pdf 从 url 转换为流
【发布时间】:2012-10-21 23:44:08
【问题描述】:

我有一个托管在http://test.com/mypdf.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();
}

【问题讨论】:

  • 你到底想做什么?向用户发送本地 pdf 以便他保存?从用户那里接收pdf(上传)并保存到本地磁盘?究竟是什么?
  • 基本上我从 webservice 获取 pdf 的 url,将其发送到我的应用程序,在我的应用程序中将其转换为流并将其发送到另一个 web 服务,然后在那里我将读取流转换回 pdf 并保存...希望不会造成混淆

标签: c# asp.net pdf stream uri


【解决方案1】:

这将起作用:

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 ...
}

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

【讨论】:

  • Stream 上的一种实用方法,可让您从一个流复制到另一个流。
  • 基本上我的要求是从 web 服务获取 pdf 的 url,将其发送到我的应用程序,在我的应用程序中将其转换为流并将其发送到另一个 web 服务,然后我将在那里读取流转换回 pdf 并保存...希望它不会混淆
  • 它可能依赖于框架。但是,您可以自己轻松编写复制代码/扩展方法。它只是从一个流中读取并写入另一个流。你的问题很简单,你可以使用我的代码(有或没有 CopyFrom),在......做其他事情......你可以根据需要将 mem 传递给 Web 服务。
  • 已经尝试了你的方法,但仍然得到上面截图的异常
  • @MaxHodges 你说得对,过去和现在都是多么尴尬!现在解决了,谢谢。
【解决方案2】:

您可能想看看WebClient.DownloadFile

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

您也可以尝试WebClient.DownloadData,它将文件保存到内存中的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 字符串,但希望您使用的是生成的客户端,它会为您处理这些问题。如果您可以详细说明您将文件发送到的网络服务类型,我可能会提供更多信息..

【讨论】:

  • 我知道我可以做到,但我的要求是不要直接保存它,因为我要把它发送到另一台服务器。
  • 有什么阻止您使用byte[] 吗?如果您不将任何内容保存到磁盘,我认为无论如何您都需要一个内存缓冲区。请查看我的更新答案。
  • 能否发一份使用字节[]的样本
  • 我添加了一些示例代码,但不确定您要将文件发送到的网络服务类型。让我知道这是否有帮助。
  • 这是一个 wcf 服务,当使用您提供的代码示例时,我可以看到具有字节的数据,但在传输到 wcf 时出现此错误,请您帮忙:格式化程序在尝试时抛出异常反序列化消息:尝试反序列化参数tempuri.org/:objToSave 时出错。 InnerException 消息是“反序列化 System.Collections.Generic.List`1 类型的对象时出错
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2020-12-24
  • 2014-09-14
  • 2023-03-12
  • 2016-03-17
相关资源
最近更新 更多