[英]Convert html to image with pagination using C#
我正在c#4.0中的Windows服务上,可以转换图像中的不同文件(tif和jpeg)
我想在图像中转换HTML文件(通常是电子邮件)时遇到问题。
我使用WebBrowser
var browser = new WebBrowser();
browser.DocumentCompleted += this.BrowserDocumentCompleted;
browser.DocumentText = html;
和DrawToBitmap
var browser = sender as WebBrowser;
Rectangle body = new Rectangle(browser.Document.Body.ScrollRectangle.X * scaleFactor,
browser.Document.Body.ScrollRectangle.Y * scaleFactor,
browser.Document.Body.ScrollRectangle.Width * scaleFactor,
browser.Document.Body.ScrollRectangle.Height * scaleFactor);
browser.Height = body.Height;
Bitmap output = new Bitmap(body.Width, body.Height);
browser.DrawToBitmap(output, body);
它适用于中小型html,但对于较长的html(例如22000高度px或更高),我在DrawToBitmap上具有GDI表现:
无效的参数
图片GDI +无效
根据互联网,这种错误会因为图像太大而附加。
我的问题:如何转换X图像中的html(分页)而又不产生大图像和裁剪,如果不使用库就可以。
先感谢您。
编辑:我发现了一个棘手的解决方案:用div女巫包围html,将页面设置为另一个,例如,偏移量为:
<div style="height:3000px; overflow:hidden">
<div style="margin-top:-3000px">
但是此解决方案可以在一行文本或图像中间进行裁剪...
您可以尝试创建自定义IE打印模板,并使用DEVICERECT和LAYOUTRECT元素来驱动分页。 这样,线条就不会在中间被剪掉,并且您将每个DEVICERECT
的位图捕获为页面。 您需要向MSHTML文档对象( webBrowser.Document.DomDocument as IOleCommandTarget
)发出CGID_MSHTML
/ IDM_SETPRINTTEMPLATE命令,以启用特定于打印模板的元素标签。 有关打印模板的更多信息,请参见此处 。
[编辑]您甚至可以在DEVICERECT
对象上使用IHTMLElementRender :: DrawToDC API DEVICERECT
图DC上绘制其内容。 您需要为您的WebBrowser
托管应用启用FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI
并禁用FEATURE_GPU_RENDERING
功能控制设置 ,才能使用IHTMLElementRender::DrawToDC
。
谢谢您的协助。
我通过使用打印和虚拟打印机来获取图像文件,创建了一个解决方案。
将html保存在文件中,并删除所有编码:
html = Regex.Replace(html, "<meta[^>]*http-equiv=\"Content-Type\"[^>]*>", string.Empty, RegexOptions.Multiline);
using (var f = File.Create(filePath))
{
var bytes = Encoding.Default.GetBytes(html);
f.Write(bytes, 0, bytes.Length);
}
运行打印而不显示Web浏览器和打印弹出窗口:
const short PRINT_WAITFORCOMPLETION = 2;
const int OLECMDID_PRINT = 6;
const int OLECMDEXECOPT_DONTPROMPTUSER = 2;
dynamic ie = browser.ActiveXInstance;
ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION);
我使用PDFCreator进行虚拟打印,它将所有文件保存在一个文件夹中。 获取所有文件并不容易(要知道何时完成打印,有多少文件以及何时可以使用它们……),但这并不是本文的目的!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.