2

私はC#4.0でWindowsサービスに取り組んでおり、画像内の異なるファイル(tifとjpeg)を変換しています

HTMLファイル(通常は電子メール)を画像に変換したいときに問題があります。

ウェブブラウザを使用しています

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 px 以上など) では DrawToBitmap に GDI 例外があります。

  • 無効なパラメーター

  • 画像 GDI+ が有効ではありません

インターネットによると、画像が大きすぎるため、この種のエラーが追加されます。

私の質問: 大きな画像を生成せずに X 画像 (ページネーション) で html を変換するにはどうすればよいですか?ライブラリを使用せずに可能であれば。

前もって感謝します。

編集:トリッキーな解決策を見つけました:たとえば、ページを設定するdivウィッチとオフセット用に別のウィッチでhtmlを囲みます:

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

ただし、このソリューションでは、テキスト行または画像の途中でトリミングできます...

4

2 に答える 2

1

カスタムIE 印刷テンプレートを作成してみて、 DEVICERECT要素とLAYOUTRECT要素を使用してページネーションを操作できます。その場合、線は途中で切れることはなく、それぞれのビットマップをページとしてキャプチャします。/ IDM_SETPRINTTEMPLATEコマンドを MSHTML ドキュメント オブジェクト ( ) に発行して、これらのような Print Template 固有の要素タグを有効にする必要があり ます。印刷テンプレートの詳細については、こちらを参照してください。DEVICERECTCGID_MSHTMLwebBrowser.Document.DomDocument as IOleCommandTarget

[編集済み]オブジェクトでIHTMLElementRender::DrawToDC API を使用して、DEVICERECTそのコンテンツをビットマップ DC に描画することもできます。ホスティング アプリで使用するには、機能制御設定を有効FEATURE_IVIEWOBJECTDRAW_DMLT9_WITH_GDIまたは無効にする必要があります。FEATURE_GPU_RENDERING WebBrowserIHTMLElementRender::DrawToDC

于 2013-10-07T11:17:45.670 に答える
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);
}

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 を使用すると、すべてのファイルがフォルダーに保持されます。このファイルのすべてを取得するのは簡単ではありません (印刷がいつ終了するか、ファイルの数、およびそれらをいつ使用できるかを知ることは...) ですが、それはこの投稿の目的ではありません!

于 2013-10-15T13:41:22.477 に答える