从memorystream渲染pdf

时间:2014-11-11 10:42:17

标签: winforms pdf memorystream

我已经搜索了一整天的解决方案,但不知怎的,我找不到它。 我想要的是从数据库(二进制文件,如PDF)获取数据到MemoryStream(我成功地这样做),但问题是我希望将该文件预览到WebBrowser控件。

所以代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace MemoryStreamTest
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    MemoryStream memory = new MemoryStream();
    //byte[] temp;

    private void Form1_Load(object sender, EventArgs e)
    {
      memory = GetBlobFile();
    }
    private MemoryStream GetBlobFile()
    {
        MemoryStream ms = new MemoryStream();
        string SQL = "SELECT [SnapshotPDF] FROM [DBtest].[dbo].[SamplePDF] WHERE id = " + 21;
        SqlConnection conn = new SqlConnection("Data Source=database;Initial Catalog=DBtest; User ID=test; Password=test;");
        SqlCommand comm = new SqlCommand(SQL, conn);
        conn.Open();
        byte [] result = (byte[])comm.ExecuteScalar();
        conn.Close();
        if (result != null)
        {
            ms.Write(result, 0, result.Length);
            ms.Position = 0;
        }
        return ms;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //webBrowser1.DocumentText = "application/pdf";
        webBrowser1.DocumentStream = memory; 
    }
}
}

PDF render

实际上webBrowser确实从内存中输出内容,但显然从上面的图片中呈现为文本... 我如何强制渲染为PDF?

如果无法使用webBrowser控件,是否可以在WinForms中使用任何其他控件来从内存中预览/呈现PDF。

2 个答案:

答案 0 :(得分:1)

您必须实现异步可插拔协议,例如IClassFactory,IInternetProtocol ...然后使用CoInternetGetSession注册您的协议。当IE调用您的实现时,您可以从内存提供图像数据/提供mime类型。

这有点乏味,但可行。查看MSDN上的IInternetProtocol和可插拔协议文档。

答案 1 :(得分:0)

完成后,我发现了一个小错误,我纠正了它。这是完整的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using Ghostscript.NET;
using Ghostscript.NET.Viewer;

namespace MemoryStreamTest
{

public partial class Form1 : Form
{

    Stream stream;
    byte[] result;
    private GhostscriptViewer _viewer;
    private GhostscriptVersionInfo _gsVersion = GhostscriptVersionInfo.GetLastInstalledVersion();
    private Bitmap _pdfPage = null;

    public Form1()
    {
        InitializeComponent();
        pictureBox1.Width = 100;
        pictureBox1.Height = 100;
        _viewer = new GhostscriptViewer();
        _viewer.DisplaySize += new GhostscriptViewerViewEventHandler(_viewer_DisplaySize);
        _viewer.DisplayUpdate += new GhostscriptViewerViewEventHandler(_viewer_DisplayUpdate);
        _viewer.DisplayPage += new GhostscriptViewerViewEventHandler(_viewer_DisplayPage);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        GetBlobFile();
    }
    private void GetBlobFile()
    {
        string SQL = "SELECT [SnapshotPDF] FROM [test].[dbo].[InvoiceAdded] WHERE id = " + 21;
        SqlConnection conn = new SqlConnection("Data Source=test;Initial Catalog=test; User ID=test; Password=test;");
        SqlCommand comm = new SqlCommand(SQL, conn);
        conn.Open();
        result = (byte[])comm.ExecuteScalar();
        conn.Close();
        stream = new MemoryStream(result);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ConvertToBitmap();
    }

    private void ConvertToBitmap()
    {
        _viewer.Open(stream, _gsVersion, true);    
    }
    //DisplayPage
    void _viewer_DisplayPage(object sender, GhostscriptViewerViewEventArgs e)
    {
        pictureBox1.Invalidate();
        pictureBox1.Update();
    }
    //DisplaySize - dynamically
    void _viewer_DisplaySize(object sender, GhostscriptViewerViewEventArgs e)
    {
        pictureBox1.Image = e.Image;
    }
    //DisplayUpdate - automatic update picture
    void _viewer_DisplayUpdate(object sender, GhostscriptViewerViewEventArgs e)
    {
        pictureBox1.Invalidate();
        pictureBox1.Update();
    }
}
}

请记住,为此,我需要从Ghostscript.NET添加.dll(我的爱国者来自克罗地亚的一个很好的包装),我也需要从GhostScript interpreter安装Ghostscript解释器

还要感谢用户:sm.abdullah

这实际上指向了正确的方向。 干杯