【问题标题】:How to save FileSteam as PDF file如何将 FileSteam 保存为 PDF 文件
【发布时间】:2011-07-22 09:24:17
【问题描述】:

我正在使用第三方工具从扫描仪获取扫描的内容。单击按钮时,它会执行代码并将内容作为 FileStream 提供。现在我需要将此 FileStream 内容作为 pdf 文件保存到指定文件夹中。

保存后我需要在浏览器中打开文件。如何将 FileStream 保存为 PDF 文件?

【问题讨论】:

标签: c# asp.net pdf save filestream


【解决方案1】:

您可以将流直接写入响应的输出缓冲区。

因此,如果您在代码中从扫描仪获得文件流的位置。只需从扫描仪文件流中读取字节并将它们写入Response.OutputStream

将 contentType 设置为application/pdf

确保您不返回任何其他内容。用户浏览器将执行它现在配置的任何操作,保存到磁盘或显示在浏览器中。此时您也可以保存到服务器上的磁盘,以备不时之需。

我假设您的文件流已经是 pdf,否则您需要使用 itextsharp 之类的东西来创建 pdf。

编辑 这是一些粗略且现成的代码。您需要整理一下,例如添加异常捕获以确保正确清理文件流。

    public void SaveToOutput(Stream dataStream)
    {
        dataStream.Seek(0, SeekOrigin.Begin);
        FileStream fileout = File.Create("somepath/file.pdf");

        const int chunk = 512;
        byte[] buffer = new byte[512];

        int bytesread = dataStream.Read(buffer,0,chunk);

        while (bytesread == chunk)
        {
            HttpContext.Current.Response.OutputStream.Write(buffer, 0, chunk);
            fileout.Write(buffer, 0, chunk);
            bytesread = dataStream.Read(buffer, 0, chunk);
        }

        HttpContext.Current.Response.OutputStream.Write(buffer, 0, bytesread);
        fileout.Write(buffer, 0, bytesread);
        fileout.Close();

        HttpContext.Current.Response.ContentType = "application/pdf";
    }

西蒙

【讨论】:

  • 是的文件流已经是 pdf。你能解释一下你的解决方案吗?我猜你给了我正确的解决方案,但我无法正确地得到它。
  • 是的,我需要将内容保存到磁盘。那么如何做到这一点呢?
【解决方案2】:

您可能想查看 SourceForge 上的 C# PDF 库:http://sourceforge.net/projects/pdflibrary/

【讨论】:

    【解决方案3】:

    如果我的理解正确,第三方库正在向您发送包含扫描文档数据的流,您需要将其写入文件吗?如果是这种情况,您需要在 C# 中查找文件 I/O。这是link 和一个示例:

    Stream sourceStream = scanner.GetOutput(); // whereever the source stream is
    FileStream targetStream = File.OpenWrite(filename, FileMode.Create());
    int bytesRead = 0;
    byte[] buffer = new byte[2048];
    while (true) {
         bytesRead = sourceStream.Read(buffer, 0, buffer.length);
         if (bytesRead == 0)
             break;
         targetStream.Write(buffer, 0, bytesRead);
    }
    sourceStream.Close();
    targetStream.Close();
    

    【讨论】:

    • 是的,它正在保存文件。当我打开它时显示 adobe reader 无法打开此文件的错误消息。
    • 这只是保存流。但实际数据不是PDF格式。您需要使用单独的库来翻译使用其他答案中提到的第三方库将流式传输到 PDF。
    【解决方案4】:
    【解决方案5】:

    另一个著名的 PDF 库(我过去也使用过)是 iTextSharp。您可以查看this tutorial,了解如何您的 Stream 转换为 PDF,然后让用户下载。

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2014-05-16
      • 2015-11-15
      • 2019-03-24
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多