【问题标题】:How to display SQL Server database image base64 in Aspose Word Document如何在 Aspose Word 文档中显示 SQL Server 数据库图像 base64
【发布时间】:2017-03-29 10:47:13
【问题描述】:

我是 Aspose 的新手,遇到以下问题:

我在 SQL Server 2008 数据库中有图像,存储为 Base64 字符串。我想使用 Aspose 在 Word 文档中显示它们。

我已成功导出其他数据,但无法显示图像。谁能帮帮我?

提前感谢您的支持。

这是我的代码:

private Document createDocs(Guid ? ID)
{
    Document doc = new Document(HostingEnvironment.MapPath("~/Content/Template.doc"));
    DataTable Order = ExecuteDataTable(inspID);

    if (!(Order == null))
    {
        doc.MailMerge.FieldMergingCallback = new HandleMergeImageFieldFromBlob();
        doc.MailMerge.ExecuteWithRegions(Order);
    }

    return doc;
}

public DataTable ExecuteDataTable(Guid? ID)
{
    var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyStringConnection"];

    SqlConnection Conn = new SqlConnection(connectionString.ConnectionString);

    try
    {
        Conn.Open();

        SqlCommand cmd = new SqlCommand("SELECT * FROM blahblah, Conn);
        cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = ID;

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.SelectCommand = cmd;

        DataTable table = new DataTable();
        da.Fill(table);

        return table;
    }
    finally
    {
        if (!(Conn == null))
        {
            Conn.Close();
        }
    }
}

private void SendToBrowser (Document doc, string outputFormat, Page page)
{
    MemoryStream stream = new MemoryStream();
    doc.Save(stream, SaveFormat.Doc);

    page.Response.Clear();
    page.Response.ClearHeaders();
    page.Response.ClearContent();
    page.Response.ContentType = "application/doc";
    page.Response.AddHeader("content-disposition", "attachment; filename=base_file.doc");

    byte[] bytes = stream.GetBuffer();

    page.Response.BinaryWrite(bytes);
    page.Response.End();
}

public class HandleMergeImageFieldFromBlob : IFieldMergingCallback
{
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs args)
    {
        // Do nothing.
    }

    /// <summary>
    /// This is called when mail merge engine encounters Image:XXX merge field in the document.
    /// You have a chance to return an Image object, file name or a stream that contains the image.
    /// </summary>
    void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs e)
    {
        // The field value is a byte array, just cast it and create a stream on it.
        var imageStream = new MemoryStream((byte[])e.FieldValue);

        // Now the mail merge engine will retrieve the image from the stream.
        e.ImageStream = imageStream;
    }
}

【问题讨论】:

    标签: c# asp.net-mvc aspose aspose.words


    【解决方案1】:

    要在 Word 中将图像邮件合并字段插入到文档中,请选择插入/字段命令,然后选择 MergeField 并键入 Image:MyFieldName。以下代码示例显示了如何使用 Base64 图像执行邮件合并操作。请检查 IFieldMergingCallback.ImageFieldMerging 的修改代码。

    public void mailmerge()
    {
        string base64String;
        using (Image image = Image.FromFile(MyDir + @"image.png"))
        {
            using (MemoryStream m = new MemoryStream())
            {
                image.Save(m, image.RawFormat);
                byte[] imageBytes = m.ToArray();
    
                // Convert byte[] to Base64 String
                base64String = Convert.ToBase64String(imageBytes);
            }
        }
    
        DataTable dt = new DataTable();
        dt.Columns.Add("ImageData", typeof(string));
    
        DataRow row1 = dt.NewRow();
        row1["ImageData"] = base64String;
        dt.Rows.Add(row1);
    
        Document doc = new Document(MyDir + "in.docx");
        doc.MailMerge.FieldMergingCallback = new HandleMergeImageFieldFromBlob();
        doc.MailMerge.Execute(dt);
        doc.Save(MyDir + "Out.docx");
    }
    
    public class HandleMergeImageFieldFromBlob : IFieldMergingCallback
    {
        void IFieldMergingCallback.FieldMerging(FieldMergingArgs args)
        {
            // Do nothing.
        }
    
        /// <summary>
        /// This is called when mail merge engine encounters Image:XXX merge field in the document.
        /// You have a chance to return an Image object, file name or a stream that contains the image.
        /// </summary>
        void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs e)
        {
            var imageStream = new MemoryStream((byte[])Convert.FromBase64String(e.FieldValue.ToString()));
    
            // Now the mail merge engine will retrieve the image from the stream.
            e.ImageStream = imageStream;
        }
    }
    

    我与 Aspose 合作,担任开发人员传道者。

    【讨论】:

    • 这对我不起作用。是否有任何文档可以提供更多帮助?
    • 我在玩,我看到在现场使用 C:\...jpg 会做一些事情。这可能对我有用。 (正是图像:将我推向了正确的方向,谢谢)
    • 我没有 doc.MailMerge.FieldMergingCallback = new HandleMergeImageFieldFromBlob();我也会试试的。
    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多