首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebBrowser控制中的打印水印背景图像

WebBrowser控制中的打印水印背景图像
EN

Stack Overflow用户
提问于 2019-11-26 11:42:18
回答 2查看 768关注 0票数 2

我希望在我的html文档中有透明的水印背景图像并打印出来。为此,我使用svc数据uri创建了以下背景映像:

代码语言:javascript
复制
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控件打印背景图像,我尝试了以下文章:如何在WebBrowser控件中打印背景图像和样式。但由于IE的限制,它似乎没有打印我的数据-uri svc图像。

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

这是我尝试过的另一种解决方案。

我试着在网页浏览器中打印转换成图像的HTML,但是它打印的是空页面。为此,我使用了HTMLRenderer是一个nuget包。引用了这个回答

代码语言:javascript
复制
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;

}
代码语言:javascript
复制
MemoryStream HtmlImage = ConvertHtmlToImage(processedDocTest);
webBrowserTest = new System.Windows.Forms.WebBrowser();
webBrowserTest.DocumentStream = HtmlImage; //Assign the image as a stream 
代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-28 20:10:21

Internet很好地显示svg数据uri背景图像,但在打印svg数据uri背景图像时却不能很好地工作。

要无障碍地打印背景图像,可以使用svg映像而不是数据uri,或者如果出于某种原因,您希望使用数据uri,然后使用透明的png作为背景图像。

在这篇文章中,我假设您希望在运行时生成文本的透明png图像,并使用数据uri格式作为页面的背景图像。

以下是答案的积木:

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

像这样印刷:

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

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

代码语言:javascript
复制
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:

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

在WebBrowser控件中启用打印背景

正如我在关于在WebBrowser中打印背景图像的链接答案中所解释的,您需要更改注册表中的设置。(欲了解更多细节,请阅读链接的帖子。)

代码语言:javascript
复制
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控件而不显示打印对话框

正如我在另一篇关于打印WebBrowser控件而不显示打印对话框的文章中所解释的,只需使用web浏览器控件的Print()方法即可。(您可以在链接的帖子中阅读更多细节。)

代码语言:javascript
复制
webBrowser1.Print();

将所有的东西放在一个示例

在这里,我把所有的东西放在一起打印一个html,在运行时具有一个数据uri透明的背景图像:

代码语言:javascript
复制
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();
    };
}

其结果是:

票数 3
EN

Stack Overflow用户

发布于 2019-11-28 14:07:23

使用本守则:

代码语言:javascript
复制
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);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59050179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档