Преобразование 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">
Но это решение может обрезать на строка текста или в середине изображения...
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