需求:我需要实现给浏览器打印添加水印的效果
实现原理:通过hook打印API Endpage,在调用Endpager前获取打印机HDC,并通过该HDC使用GDI+的DrawImage画出我需要的水印内容
出现问题:notepad,office,ie浏览器,火狐浏览器等进程都已经能按预期打印出期望的水印内容,位置和尺寸都符合,但是测试Chrome浏览器的时候,画出来的坐标和尺寸都被放大了好几倍,经过多个软件测试,发现chromium内核的浏览器都有这个问题,包括360浏览器,QQ浏览器,chrome浏览器。
测试用打印机:XPS
参考资料:
https://www.codeproject.com/Articles/764057/GDI-Drawing-and-Printing 该文章描述了显示器和打印机DPI不同,所以若期望打印结果跟屏幕显示一样,则需要按照屏幕和打印机的比例对水印尺寸做处理,我按照文章描述对尺寸做处理后,notepad测试打印出来的尺寸效果是预期内的了,但是chrome打印出来的尺寸都是DPI转换前的一样
尝试:
- IsProcessDPIAware导致?
结果:经过测试,notepad和chrome返回都是TRUE。 - 获取HDC和HDC关联的Gdiplus::Graphics对象基础信息,对比notepad和chrome得到的属性是否一致(可能有遗漏)
结果:一致,GetDpiX/Y、GetPageScale、GetPageUnit等怀疑影响画图大小的属性都对比过是一样的 - 我用的图片有问题?
结果:没问题,改用API画图,chrome进程用DrawRectangle的画出来的结果也是大几倍