我解決了哪怕很小的一個問題,我也想記錄下來來見證我的經歷。
背景:
一、使用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());
如果有效伙伴也遇到了上面的問題,并且最終解決了,請指教,哈哈。
?
?