不规范的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