首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

不轨范的html文件打印,用IWebBrowser2那一套,有什么办法

2013-01-02 
不规范的html文件打印,用IWebBrowser2那一套,有什么办法?这个文件是客户后台生成的,格式不太规范,标签错误

不规范的html文件打印,用IWebBrowser2那一套,有什么办法?
这个文件是客户后台生成的,格式不太规范,标签错误、未封闭的情况到处都有

用IE能正常打开并打印,现在就想用IWebBrowser2来实现程序打印功能,结果遇到障碍了

get_scrollWidth、get_scrollHeight无法得到实际大小;CDHtmlDialog::OleDraw(内部调用IViewObject::Draw)无法绘制到打印机上

有什么办法能解决吗?怎样提高 Web Browser 对象的容错性?先谢谢了。下面是代码。


HRESULT hr = S_OK;

CComPtr<IHTMLElement> spbodyelement;
// this_class 继承自 CDHtmlDialog
VERIFY(SUCCEEDED(hr = m_spHtmlDoc->get_body(&spbodyelement)));

CComPtr<IHTMLElement2> spbody2;
VERIFY(SUCCEEDED(hr = spbodyelement->QueryInterface(IID_IHTMLElement2, (void**)&spbody2)));

CComPtr<IViewObject> spviewobj;
VERIFY(SUCCEEDED(hr = m_spHtmlDoc->QueryInterface(IID_IViewObject, (void**)&spviewobj)));

// 网页大小
// 遇到不规范的html数据就无法得到实际值
CRect rcthtml;
rcthtml.left = rcthtml.top = 0;
VERIFY(SUCCEEDED(hr = spbody2->get_scrollWidth(&rcthtml.right)));
VERIFY(SUCCEEDED(hr = spbody2->get_scrollHeight(&rcthtml.bottom)));

MoveWindow(rcthtml);

if (m_deqPrintTask.empty())
{
return;
}

const boost::shared_ptr<_PrintTask>& spprinttask = m_deqPrintTask.front();
ASSERT(spprinttask);

// cdcPrinter是CDC类型的,已经初始化并用DEVMODE ResetDC过了
// 取得打印纸大小
CRect rctdev(0, 0,
spprinttask->cdcPrinter.GetDeviceCaps(HORZRES),
spprinttask->cdcPrinter.GetDeviceCaps(VERTRES));

spprinttask->cdcPrinter.StartDoc(_T("HTML print"));
spprinttask->cdcPrinter.StartPage();

// 这里 hr 始终是 S_OK ,但遇到不规范的html格式就无法绘制到打印机
VERIFY(SUCCEEDED(hr = OleDraw(m_spHtmlDoc,
DVASPECT_CONTENT,
spprinttask->cdcPrinter,
rctdev)));

spprinttask->cdcPrinter.EndPage();
spprinttask->cdcPrinter.EndDoc();

[解决办法]
除非你自己解析+补全,否则还是让他们把页面做规范吧。
[解决办法]
好像有一个接口,可以把网页生成图片,生成的图片再打印是不是也可以,也算一个思路。
[解决办法]
不自己处理打印的布局
用webbrowser自带的打印功能
IWebBrowser2::ExecWB

你可以参考一下这里:
http://heart-zhao.iteye.com/blog/140314

热点排行