【问题标题】:WebBrowser class - how to print document without header/footer?WebBrowser 类 - 如何打印没有页眉/页脚的文档?
【发布时间】:2013-03-14 17:42:31
【问题描述】:

我正在使用WebBrowser 类来打开文档、更改值、保存和打印。问题是,它打印的文档包括页眉(“第 1 页,共 1 页”)和页脚(文档的根 + 日期)

我查看了文档,但没有找到删除它们的方法。甚至可以使用WebBrowser 还是我应该寻找替代方案?

【问题讨论】:

  • 仅在 .NET 中绝对不可能。从理论上讲,这可以通过使用 WebBrowser 的 ActiveXInstance 属性访问底层本机组件来完成,但我现在似乎有最该死的时间让它工作。

标签: c# .net winforms printing browser


【解决方案1】:

有一个解决方案,可能不如它本来的那么干净。由于 WebBrowser 继承了 Internet Explorer 的设置,因此可以更改注册表中的值。幸运的是,这些值在 HKCU 下,因此不需要管理权限。

看看https://stackoverflow.com/a/1321314/1630928

【讨论】:

    【解决方案2】:

    这样做的诀窍是将包含变量 ByRef SafeArray 的 Variant 传递给 WebBrowser 控件。我还没有弄清楚如何从 C# 中做到这一点。这是其他正在解决相同问题的人使用托管 C++

    http://www.limilabs.com/blog/printing-in-webbrowser-control-custom-header-and-footer

    【讨论】:

    【解决方案3】:

    不是 C#,而是我根据现已失效的 KB267240 提出的 C++ 代码。它会在打印时删除页眉和页脚:

    BOOL bRes = FALSE;
    
    //Get IWebBrowser2 from your IE control
    CComPtr<IWebBrowser2> pWebBrowser = this->GetIWebBrowser2();
    if(pWebBrowser)
    {
        HRESULT hr;
        COleVariant varNull;
    
        SAFEARRAYBOUND psabBounds[1];
        SAFEARRAY *psaHeadFoot;
        hr = S_OK;
    
        VARIANT vArg;
        BOOL bGot_vArg = FALSE;
    
        VARIANT vHeadStr, vFootStr;
        long rgIndices;
        VariantInit(&vHeadStr);
        VariantInit(&vFootStr);
    
        // Initialize header and footer parameters to send to ExecWB().
        psabBounds[0].lLbound = 0;
        psabBounds[0].cElements = 3;
        psaHeadFoot = SafeArrayCreate(VT_VARIANT, 1, psabBounds);
        if(psaHeadFoot)
        {
            // Argument 1: Header
            vHeadStr.vt = VT_BSTR;
            vHeadStr.bstrVal = SysAllocString(L" ");    //Must be at least one space
            if (vHeadStr.bstrVal)
            {
                // Argument 2: Footer
                vFootStr.vt = VT_BSTR;
                vFootStr.bstrVal = SysAllocString(L" ");    //Must be at least one space
                if(vFootStr.bstrVal)
                {
                    rgIndices = 0;
                    SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&vHeadStr));
                    rgIndices = 1;
                    SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&vFootStr));
                    rgIndices = 2;
                    SafeArrayPutElement(psaHeadFoot, &rgIndices, static_cast<void *>(&varNull));    //Set stream to NULL as we don't need it
    
                    //NOTE: Currently, the SAFEARRAY variant must be passed by using
                    // the VT_BYREF vartype when you call the ExecWeb method.
                    VariantInit(&vArg);
                    vArg.vt = VT_ARRAY | VT_BYREF;
                    vArg.parray = psaHeadFoot;
    
                    //Got it
                    bGot_vArg = TRUE;
                }
            }
        }
    
    
        //Did we get all the vars?
        if(bGot_vArg)
        {
            if(SUCCEEDED(hr = pWebBrowser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, &vArg, NULL)))
            {
                //All good
                bRes = TRUE;
            }
        }
        else
        {
            //Use fallback (that will keep the footer & header)
            if(SUCCEEDED(hr = pWebBrowser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, varNull, varNull)))
            {
                //Printed via fallback
                bRes = TRUE;
            }
        }
    
        //Clean up
        VariantClear(&vHeadStr);
        VariantClear(&vFootStr);
        if(psaHeadFoot)
        {
            SafeArrayDestroy(psaHeadFoot);
            psaHeadFoot = NULL;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2011-11-01
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多