我解决了哪怕很小的一个问题,我也想记录下来来见证我的经历。
背景:
一、使用libhuru库生成pdf报告
最近参与一些测试工作,希望测试结束后能够根据测试得到的数据和图像自动生成测试报告,最开始调研到了生成报告的库有libharu和libpdf,libharu是开源库但是很久没有人维护了,libpdf商业使用需要授权,最后选择使用libharu,关于使用libharu库,首先是对应的libhpdf.lib库的编译,需要依赖zlib和libpng两个库,在windows下使用cmake编译的步骤可以参考这篇博客,libharu编译过程,我按照这篇文章编译了64位的libhpdfs.lib,关于基于libharu库,可以解决报告中的表格和图像加载的问题的例程,可以参考这里基于libharu库生成pdf报告的例程。我使用刚才编译的64位的libhpdf.lib来编译这个例程,除了加载png图像失败之外,其他我用到的函数都是正常的。我只能先加载jpg图像,但是图片压缩严重,不够清晰。就无法加载png图像这个问题,我咨询过这个例程的作者,作者也很友好的测试了我的demo,并没有复现我描述的问题,后来我使用了他提供的libhpdf.lib,竟然成功加载了png图像,当然我必须是在x86的模式下,而我的大工程是x64的,所以这个问题很是不好解决,网上也看到很多小伙伴反应使用libhpdf库不能成功加载png图像的问题,问题主要出在下面这个函数,这个函数调用后返回的img为空,所以无法在pdf文件上加载图像。有网友说是分配内存失败,但是我一直也没有找到解决这个问题的有效的方法,只好先放一下。
img = HPDF_LoadPngImageFromFile(pdf, t.path.c_str());
上个月末,跟line manager汇报工作,他对我生成的报告上的图像很是不满意,其实穷自己也不满意,实在是不清晰,但是这个问题一直没能得到解决,我也是很是苦恼,他再次给我建议试一下使用python看能不能有好的解决方法,一想到我需要使用python重新搞一遍,我就有些苦恼,担心工作量会很大,这又到月末,如果做不出效果,要影响我这个月的绩效了。但是没有办法,谁让我自从五一放假回来后,就有些不思进取,玩物丧志呢,我还是 硬着头皮,继续搜索python方法。前几天刚充了会员,现在一搜,搜到了下面这篇文章,使用python生成图文并茂的pdf报告,让我耳目一新,感叹一句,花了钱果然不一样,办事效率高了很多。
二、使用python和reportlab库生成pdf报告
1. windows下安装reportlab
首先要保证你电脑上已经安装了python了哈,我电脑安装的python版本为3.8.7
pip版本为20.3.3
然后
1. win+R
2. 输入cmd #打开命令行窗口
3. 在命令行输入:pip install reportlab
如果在安装失败请查看这篇文章,那你退出那个软件(哈哈,你懂得),再重现安装一下。
三、参考现有的例程
我第一次接触reportlab这个库,想在很短的时间内看到让人满意的效果,我不得不依赖于一个县城的模板,于是我找到了这篇文章python之reportlab生成PDF文件。这个例子对于初学者来说是很具有参考价值的,但是唯一不足的地方是,调用函数时的输入没有给出,因为我对python使用不熟,不过经过几次测试,和研究也能够搞清楚,函数的输入时directory和List类型。因为我已经把测试数据保存到本地的csv文件中,所以我读取了csv文件将里面的数据写入到表格中去。
四、在C++工程中执行python脚本
我的工作环境是win10,64位VS2017,我的测试工程是用C++写的,我希望的是在测试程序运行结束后,但是程序退出之前执行python脚本自动生成pdf测试报告,那我面临的一个问题就是如何在C++工程中执行python脚本,那么你就可以直接使用一个简单直接粗暴有效的方法就可以。这几行代码就是去执行你指定的python脚本, 如果你需要将C++中的一些参数传递给python脚本,那么直接在command后面加上所需要参数就可以了。
std::string filename = "./test_report.py";
std::string command = "python ";
command += filename;
system(command.c_str());
五、C++工程中调用python函数或者进行数据交换
1. 首先可以参考这篇文章配置相应的python环境Windows10 C++(VS2017)调用python(python3.8)python配置,
(1)
(2)
(3)
2. 添加环境变量
上面的环境配置好了后可以测试一下上面链接中博主给的例子。我测试的结果存在一个问题就是,当执行的是普通的python脚本,也就是该python脚本中没有调用第三方库的时候,可以成功执行,但是当python脚本中有调用第三方的库,如通过import numpy as np调用numpy库时,demo中的pModule = PyImport_ImportModule("helloWorld");就会出错,返回的pModule为空。而如果删掉import numpy as np,又正常调用了,我花了一天的时间一直没有解决这个问题,后来考虑到我只是执行单独的一个脚本,不需要进行数据交换,也不需要在C++工程中调用python中的函数,那就用最简单直接的方法解决问题吧,就是我在上面说到的方法。
std::string filename = "./test_report.py";
std::string command = "python ";
command += filename;
system(command.c_str());
如果有效伙伴也遇到了上面的问题,并且最终解决了,请指教,哈哈。