2013-09-30 60 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