繁体   English   中英

使用C#通过分页将html转换为图像

[英]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打印模板,并使用DEVICERECTLAYOUTRECT元素来驱动分页。 这样,线条就不会在中间被剪掉,并且您将每个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM