我希望在我的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控件打印背景图像,我尝试了以下文章:如何在WebBrowser控件中打印背景图像和样式。但由于IE的限制,它似乎没有打印我的数据-uri svc图像。
如何在WebBrowser控件中打印水印背景图像?
这是我尝试过的另一种解决方案。
我试着在网页浏览器中打印转换成图像的HTML,但是它打印的是空页面。为此,我使用了HTMLRenderer是一个nuget包。引用了这个回答。
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);
}
}发布于 2019-11-28 20:10:21
Internet很好地显示svg数据uri背景图像,但在打印svg数据uri背景图像时却不能很好地工作。
要无障碍地打印背景图像,可以使用svg映像而不是数据uri,或者如果出于某种原因,您希望使用数据uri,然后使用透明的png作为背景图像。
在这篇文章中,我假设您希望在运行时生成文本的透明png图像,并使用数据uri格式作为页面的背景图像。
以下是答案的积木:
像这样印刷:

在运行时从文本创建透明图像。
此方法接受文本、字体、文本颜色和图像大小,然后生成图像:
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控件中启用打印背景
正如我在关于在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控件而不显示打印对话框
正如我在另一篇关于打印WebBrowser控件而不显示打印对话框的文章中所解释的,只需使用web浏览器控件的Print()方法即可。(您可以在链接的帖子中阅读更多细节。)
webBrowser1.Print();将所有的东西放在一个示例中
在这里,我把所有的东西放在一起打印一个html,在运行时具有一个数据uri透明的背景图像:
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();
};
}其结果是:

发布于 2019-11-28 14:07:23
使用本守则:
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);
}https://stackoverflow.com/questions/59050179
复制相似问题