从内存流中读取存储的 PDF

Posted

技术标签:

【中文标题】从内存流中读取存储的 PDF【英文标题】:Read a stored PDF from memory stream 【发布时间】:2015-05-15 20:18:15 【问题描述】:

我正在使用 C# 和 SQLServer 2012 处理数据库项目。在我的一个表单中,我有一个 PDF 文件,其中包含存储在表中的一些其他信息。这是成功的,但是当我想检索存储的信息时,我在显示 PDF 文件时遇到了问题,因为我无法显示它并且我不知道如何显示它。

我从内存流中读到一些文章说它不能用 Adob​​e PDF 查看器显示,有什么办法吗?

这是我从数据库中检索数据的代码:

            sql_com.CommandText = "select * from incoming_boks_tbl where [incoming_bok_id]=@incoming_id and [incoming_date]=@incoming_date";
            sql_com.Parameters.AddWithValue("incoming_id",up_inco_num_txt.Text);
            sql_com.Parameters.AddWithValue("incoming_date", up_inco_date_txt.Text);
            sql_dr = sql_com.ExecuteReader();
            if(sql_dr.HasRows)
            
                while(sql_dr.Read())
                
                    up_incoming_id_txt.Text = sql_dr[0].ToString();
                    up_inco_num_txt.Text = sql_dr[1].ToString();
                    up_inco_date_txt.Text = sql_dr[2].ToString();
                    up_inco_reg_txt.Text = sql_dr[3].ToString();
                    up_inco_place_txt.Text = sql_dr[4].ToString();
                    up_in_out_txt.Text = sql_dr[5].ToString();
                    up_subj_txt.Text = sql_dr[6].ToString();
                    up_note_txt.Text = sql_dr[7].ToString();
                    string file_ext = sql_dr[8].ToString();//pdf file extension
                    byte[] inco_file = (byte[])(sql_dr[9]);//the pdf file
                    MemoryStream ms = new MemoryStream(inco_file);
                    //here I don't know what to do with memory stream file data and where to store it. How can i display it?
                
            

【问题讨论】:

假设 WinForms 而不是 web:write the MemoryStream to a file 和 start the system's default PDF viewer。编辑:当然,将我琐碎的答案转换为琐碎的问题以发表评论。我不会复制现有的答案。 【参考方案1】:

这个答案应该给你一些选择:How to render pdfs using C#


过去我用过谷歌的开源PDF渲染项目-PDFium

有一个名为 PdfiumViewer 的 C# nuget 包,它提供了一个围绕 PDFium 的 C# 包装器,并允许显示和打印 PDF。

它直接与 Streams 一起工作,因此不需要将任何数据写入磁盘

这是我在 WinForms 应用中的示例

    public void LoadPdf(byte[] pdfBytes)
    
        var stream = new MemoryStream(pdfBytes);
        LoadPdf(stream)
    

    public void LoadPdf(Stream stream)
    
        // Create PDF Document
        var pdfDocument = PdfDocument.Load(stream);

        // Load PDF Document into WinForms Control
        pdfRenderer.Load(_pdfDocument);
    

【讨论】:

谢谢你的好回答,但你能给我一篇文章如何将此包添加到 Visual Studio 2010,它可以像添加参考一样添加吗? @honar.cs PDFium 以Nuget package 的形式提供。 Nuget 包管理器可以按照these instructions 安装到 VS2010 中 亲爱的朋友,谢谢,我想我按照你说的做了,看看这个链接里的图片postimg.org/image/h8e4p627d,你安装了这两个东西吗?如果是,那么现在我如何使用我找到的 PDFium?再次感谢您 我想在表单的特定位置显示一个 pdf 查看器,因为它还有一些其他组件?该怎么做? @honar.cs 您最好分别搜索和询问这些问题。 cmets 部分不是进行扩展讨论的地方。谢谢

以上是关于从内存流中读取存储的 PDF的主要内容,如果未能解决你的问题,请参考以下文章

使用 iTextSharp 将文本添加到内存流中的现有多页 PDF 文档

Java IO操作

文件操作流的存储与读取

如何在 C# 中从内存流中播放 MP3?

使用 NAudio 从内存流中播放 .wma

如何从 Spark 结构化流中的 Cassandra 等外部存储读取 Kafka 和查询?