在WebBrowser控件中打印水印背景图像

问题描述 投票:2回答:2

我想在我的html文档中使用透明的水印背景图像并进行打印。为此,我使用svc数据uri创建了以下背景图片:

body {
    background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%20%3D%20%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20version%20%3D%20%271.1%27%20height%20%3D%20%27100px%27%20width%20%3D%20%27100px%27%3E%3Ctext%20transform%20%3D%20%27translate(20%2C%20100)%20rotate(-45)%27%20fill%20%3D%20%27rgb(245%2C45%2C45)%27%20font-size%20%3D%20%2720%27%3E%20watermark%20%3C%2Ftext%3E%3C%2Fsvg%3E");
}

要使用WebBrowser控件打印背景图像,我尝试了这篇文章:How to print background image and styles in WebBrowser control。但是由于IE的限制,它似乎无法打印我的data-uri svc图像。

如何在WebBrowser控件中打印水印背景图像?


这是我尝试过的替代解决方案。

我尝试在Webbrowser中以静默方式打印HTML转换为图像的HTML,但是它打印的是空白页面。为此,我使用了HTMLRenderer是一个nuget程序包。参考此answer

public MemoryStream ConvertHtmlToImage(string html)
{
    Bitmap m_Bitmap = new Bitmap("image");
    HtmlRender.RenderGdiPlus(Graphics.FromImage(m_Bitmap),
                                           html);
    MemoryStream memoryStream = new MemoryStream();

    m_Bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
    return memoryStream;

}
MemoryStream HtmlImage = ConvertHtmlToImage(processedDocTest);
webBrowserTest = new System.Windows.Forms.WebBrowser();
webBrowserTest.DocumentStream = HtmlImage; //Assign the image as a stream 
private void btn_print_test_Click(object sender, EventArgs e)
{
    if (Common.TestPrinter != null && !string.IsNullOrEmpty(Common.TestPrinter))
    {
        SetupPage();
        SetDefaultPrinter(Common.TestPrinter);
    }
    PrinterSettings settings = new PrinterSettings();
    defaultPrinter = settings.PrinterName;

    if (Common.TestPrinter == defaultPrinter)
    {
        PrintTest();
    }
    else
    {
        ResetSetupPage();
        Environment.Exit(1);
    }
}
c# html .net winforms webbrowser-control
2个回答
3
投票

Internet Explorer可以很好地显示svg数据uri背景图像,但是在打印svg数据uri背景图像时效果不佳。

要轻松打印背景图像,可以使用svg图像代替数据uri,或者由于某些原因要使用数据uri,然后使用透明的png数据uri作为背景图像。

在本文中,我假设您想在运行时生成文本的透明png图像,并使用数据uri格式将该图像用作页面的背景图像。

这里是答案的基础:

  • 在运行时从文本创建透明图像
  • 将图像转换为数据uri
  • 在WebBrowser控件中启用打印背景
  • 不显示打印对话框而打印WebBrowser控件

要这样打印:

enter image description here

在运行时从文本创建透明图像

此方法接受文本,字体,文本颜色和图像大小,然后生成图像:

public Image CreateWatermarkImage(string text, Font font, Color color, Size size)
{
    var bm = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb);
    using (var g = Graphics.FromImage(bm))
    {
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        g.RotateTransform(45);
        var format = new StringFormat();
        format.Alignment = StringAlignment.Center;
        using (var brush = new SolidBrush(color))
            g.DrawString(text, font, brush, new Rectangle(Point.Empty, size), format);
    }
    return bm;
}

将图像转换为数据uri

此方法获取图像并将其转换为数据uri:

public static string GetDataURL(Image image)
{
    var bytes = (byte[])new ImageConverter().ConvertTo(image, typeof(byte[]));
    return $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
}

在WebBrowser控件中启用打印背景

正如我在关于Print Background Image in WebBrowser的链接答案中已经解释的那样,您需要在注册表中更改设置。 (有关详细信息,请阅读链接的文章。)

public void EnablePrintBackground(bool value)
{
    using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
        @"Software\Microsoft\Internet Explorer\PageSetup", true))
    {
        key.SetValue("Print_Background", value ? "yes" : "no",
            Microsoft.Win32.RegistryValueKind.String);
        key.Close();
    }
}

打印WebBrowser控件而不显示打印对话框

[正如我在另一篇有关Print WebBrowser control without showing Print Dialog的文章中已经解释的那样,只需使用Web浏览器控件的Print()方法。 (您可以在链接的文章中阅读更多详细信息。)

webBrowser1.Print();

将所有内容放在一个示例中

这里我将所有内容放在一起以在运行时打印具有数据uri透明背景图像的html:

private void Form1_Load(object sender, EventArgs e)
{
    var dataURL = "";
    using (var image = CreateWatermarkImage("Watermark!",
        new Font("Arial", 16, FontStyle.Bold), Color.Red, new Size(150, 150)))
    {
        dataURL = GetDataURL(image);
    }
    var html = $@"
        <html>
            <head>
                <style>body {{background-image: url(""{dataURL}"");}}</style>
            </head>
            <body>
                <h1>Lorem ipsum dolor sit amet</h1> 
                consectetur adipiscing elit, 
                sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
                Ut enim ad minim veniam, quis nostrud exercitation ullamco 
                laboris nisi ut aliquip ex ea commodo consequat. 
                Duis aute irure dolor in reprehenderit in voluptate velit 
                esse cillum dolore eu fugiat nulla pariatur. Excepteur sint 
                occaecat cupidatat non proident, sunt in culpa qui officia 
                deserunt mollit anim id est laborum.
            </body>
        </html>";
    webBrowser1.DocumentText = html;
    webBrowser1.DocumentCompleted += (obj, args) =>
    {
        EnablePrintBackground(true);
        webBrowser1.Print();
    };
}

这是结果:

enter image description here


-1
投票

使用此代码:

public void ConvertHtmlToImage(string html)
{
Bitmap m_Bitmap = new Bitmap(400, 600);
PointF point = new PointF(0, 0);
SizeF maxSize = new System.Drawing.SizeF(500, 500);
HtmlRenderer.HtmlRender.Render(Graphics.FromImage(m_Bitmap),html,
                                        point, maxSize);

m_Bitmap.Save(@"C:\MyHtml.png", ImageFormat.Png);
}
© www.soinside.com 2019 - 2024. All rights reserved.