2013-09-30 61 views
2

我工作的Windows服务在C#4.0分页至极变换图像不同的文件(TIF和JPEG)将HTML转换成用C#

我有一个问题,当我想转换一个HTML文件(图像通常是电子邮件)。

我使用的web浏览器

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(如22 000高像素以上) 我有GDI产生的异常在DrawToBitmap上:

  • 无效的参数

  • 不是一个像GDI +有效

根据互联网,这种错误的追加,因为图片太大。

我的问题:如何在X图像(分页)中转换html而不生成大图像和裁剪之后,以及是否可以不使用库。

预先感谢您。

编辑:我发现了一个棘手的解决方案:围绕HTML用一个div女巫会设置页面,另一个用于偏移,对于为例:

<div style="height:3000px; overflow:hidden"> 
<div style="margin-top:-3000px"> 

但是这种解决方案可以在文本行裁剪或在图像的中间...

回答

0

谢谢你的anwser Noseratio。

我创建了一个解决方案,使用打印和虚拟打印机来获取图像文件。

保存在一个文件中的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); 
} 

运行不显示网页浏览器和打印弹出打印:

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虚拟打印,它让我文件夹中的所有文件。要获取所有这个文件并不容易(知道打印完成后,有多少文件以及何时可以使用它们......),但这不是本文的目的!

1

您可以尝试创建自定义IE Print Template并使用DEVICERECTLAYOUTRECT元素来驱动分页。线条在当时不会被剪切,并且您可以将每个DEVICERECT的位图捕获为页面。您需要向MSHTML文档对象(webBrowser.Document.DomDocument as IOleCommandTarget)发出CGID_MSHTML/IDM_SETPRINTTEMPLATE命令以启用类似这些打印模板的元素标签。有关打印模板的更多信息,请参见here

将帖子你甚至可以使用IHTMLElementRender::DrawToDC API一个DEVICERECT对象上绘制其上的位图DC内容。您需要启用FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI并禁用FEATURE_GPU_RENDERINGfeature control settings您的WebBrowser托管应用才能使用IHTMLElementRender::DrawToDC