Преобразование html в изображение с разбиением на страницы с помощью C#



Я работаю над службой windows в c# 4.0, которая преобразует различные файлы в изображения (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 (например, 22 000 height px или больше)
У меня есть GDI exeptions на DrawToBitmap:





  • Недопустимый параметр



  • Не образ GDI+ действительный



Согласно интернету, этот вид ошибки добавляется, потому что изображение слишком большое.



Мой вопрос : Как я могу конвертировать html в X изображений (pagination) без создания большого изображения и обрезки после, и если это возможно без использования библиотеки.



Заранее благодарю вас.



Edit: я нашел хитрое решение: окружите html ведьмой div, которая установит страницу и другую для смещения, например:



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


Но это решение может обрезать на строка текста или в середине изображения...

597   2  

2 ответов:

Вы можете попробовать создать пользовательский шаблон печати IE и использовать элементы DEVICERECT и LAYOUTRECT для управления разбиением на страницы. Тогда линии не будут обрезаны посередине, и вы захватите растровое изображение каждого DEVICERECT в виде страницы. Вам нужно будет оформить CGID_MSHTML/команда IDM_SETPRINTTEMPLATE объекту документа MSHTML (webBrowser.Document.DomDocument as IOleCommandTarget) для включения таких тегов элементов, специфичных для шаблона печати. Дополнительную информацию о шаблонах печати можно найти здесь здесь .

[отредактировал] Вы можете даже использовать IHTMLElementRender::DrawToDC API на DEVICERECT объекта, чтобы привлечь его содержания в виде растрового постоянного тока. Вам нужно будет включить FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDI и отключить FEATURE_GPU_RENDERING настройки управления функциями для вашего WebBrowser хостингового приложения для использования IHTMLElementRender::DrawToDC.

Спасибо за ваш 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 для виртуальной печати, и он хранит все файлы в папке. Нелегко получить весь этот файл (знать, когда печать завершена, сколько файлов и когда вы можете их использовать...) но это не так. цель этого поста!

Comments

    Ничего не найдено.