0

背景情報:C#、Visual Studio 2010、ターゲット:WindowsXP以降

オブジェクトから印刷されるすべてのページの上部と下部に分類情報を追加する必要がありSystem.Windows.Forms.WebBrowserます。WebBrowser現在、にロードされ、関数で印刷されるHTMLドキュメントがありWebBrowser.ShowPrintDialog()ます。分類タイプを中心に印刷するすべてのページの上下に、どういうわけかバナーを追加する必要があります。

レジストリ設定の変更を伴う方法についての言及を見たことがありますが、これは私の場合のオプションではありません。次のCSSコードも使ってみましたが、WebBrowserではうまくいかないようですposition: fixed

CSS:

@media screen
{
    div#ClassificationTop
    {
        display: none;
    }
    div#ClassificationBottom
    {
        display: none;
    }
}
@media print
{
    div#ClassificationTop
    {
        display: block;
        position: fixed;
        top: 0;
    }
    div#ClassificationBottom
    {
        display: block;
        position: fixed;
        bottom: 0;
    }
}

<body>:で

<div id="ClassificationTop">UNCLASSIFIED
</div>
<div id="ClassificationBottom">UNCLASSIFIED
</div>

したがって、これらの方法(レジストリの回避策またはCSS position: fixed)のどちらも機能しないので、誰かが私が試すことができる他のことを知っていますか?

質問が不明な場合や詳細情報が必要な場合はお知らせください。

4

1 に答える 1

0

Web ブラウザー コントロールから印刷するための API は、これを行うための C# の構文を理解できれば、技術的にこれをサポートできます。Microsoft には KB 記事「Internet Explorer で WebBrowser コントロールのカスタム ヘッダーとフッターを印刷する方法」があります。

その記事では、ExecWB メソッドの 3 番目のパラメーターを指定して、カスタム ヘッダーとフッターを含む SAFEARRAY を含めることができることが明らかにされています。

以下は、C# 構文に変換されたナレッジ ベースの記事からコード例の一部を選択したものです。これは完全に機能するコードではありませんが、正しい方向に向けるのに役立つはずです:

    SAFEARRAYBOUND[] psabBounds = Arrays.InitializeWithDefaultInstances<SAFEARRAYBOUND>(1);
    SAFEARRAY psaHeadFoot;

    // Initialize header and footer parameters to send to ExecWB().
    psabBounds[0].lLbound = 0;
    psabBounds[0].cElements = 3;
    psaHeadFoot = SafeArrayCreate(VT_VARIANT, 1, psabBounds);

    VARIANT vHeadStr = new VARIANT();
    VARIANT vFootStr = new VARIANT();
    VARIANT vHeadTxtStream = new VARIANT();
    int rgIndices;

    VariantInit(vHeadStr);
    VariantInit(vFootStr);
    VariantInit(vHeadTxtStream);

    // Argument 1: Header
    vHeadStr.vt = VT_BSTR;
    vHeadStr.bstrVal = SysAllocString("This is my header string.");

    // Argument 2: Footer
    vFootStr.vt = VT_BSTR;
    vFootStr.bstrVal = SysAllocString("This is my footer string.");


    // Argument 3: IStream containing header text. Outlook and Outlook 
    // Express use this to print out the mail header.   
    if ((sMem = (string)CoTaskMemAlloc(512)) == null)
    {
        goto cleanup;
    }
    // We must pass in a full HTML file here, otherwise this 
         // becomes corrupted when we print.
    sMem = "<html><body><strong>Printed By:</strong> Custom WebBrowser Host 1.0<p></body></html>\0";

    rgIndices = 0;
    SafeArrayPutElement(psaHeadFoot, rgIndices, (object)(vHeadStr));
    rgIndices = 1;
    SafeArrayPutElement(psaHeadFoot, rgIndices, (object)(vFootStr));
    rgIndices = 2;
    SafeArrayPutElement(psaHeadFoot, rgIndices, (object)(vHeadTxtStream));

    //NOTE: Currently, the SAFEARRAY variant must be passed by using
            // the VT_BYREF vartype when you call the ExecWeb method.
    VARIANT vArg = new VARIANT();
    VariantInit(vArg);
    vArg.vt = VT_ARRAY | VT_BYREF;
    vArg.parray = psaHeadFoot;
    hr = webOC.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vArg, null);
于 2013-08-07T23:36:36.577 に答える