最近項目中接過了一個libharu PDF 開源庫的鍋,哈哈。於是就自己編譯了一套libharu 的MFC下的靜態庫和動態庫。
編譯libharu需要用到zlib庫和libpng庫,libpng庫又依賴zlib庫。
所以這里我們先編譯zlib庫,使用VS2010
zlib 下載地址:http://www.zlib.net/
libpng下載地址:http://www.libpng.org/pub/png/libpng.html
libharu下載地址:http://libharu.org/
下載如下三個文件:

一、編譯zlib
這里我們只編譯 USE MFC Shared DLL 下 的lib和dll 字符統一設置Unicode
打開zlib-1.2.8里面的C:\libhpdf\zlib-1.2.8\zlib-1.2.8\contrib\vstudio\vc10\zlibvc.sln文件
設置 MFC Shared DLL,Unicode,MDD,DLL生成選項,下面兩個庫也按照這個編譯選項。building zlibvc即可
程序目錄中生成了如下文件zlibwapid.dll和zlibwapid.lib
二、編譯libpng 編譯選項同zlib
打開C:\libhpdf\lpng1624\lpng1624\projects\vstudio\vstudio.sln
去掉他自己引用的zlib目錄,把$ZlibSrcDir;刪除
自己手動添加zlib庫目錄,包含zlib的頭文件,然后添加剛才生成的zlibwapid.lib目錄,linker輸入 依賴zlibwapid.lib
building 即可編譯出libpng16.dll libpng16.lib,如果報錯,加上zlib的預編譯選項,
_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_WARNINGS
ZLIB_WINAPI
ASMV
ASMINF
三、編譯libharu 生成libhpdf.dll
新建vs空控制台工程,設置編譯選項,生成exe改成生成dll,編譯選項同上面的一和二。
然后include zlib和libpng的頭文件,include libharu的頭文件,添加libharu的src源代碼, include 生成的zlib的lib 和libpng的lib
linker 輸入 libpng16.lib zlibwapid.lib
導入libharu win32\include下目錄下的hpdf_config.h文件,並且導入libhpdf.def 文件用於生成lib文件
然后在設置預處理器里面添加zlib的如下編譯選項,否則編譯不通過,
_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_WARNINGS
ZLIB_WINAPI
ASMV
ASMINF
最后可能會報錯 HPDF_3DAnnot_Set3DView無法引用的錯誤,將libhpdf.def 中的HPDF_3DAnnot_Set3DView 刪除即可。
到此生成結束:
測試代碼:
MFC工程中生成了一個pdf文件。
1 void CTESTLibharuDlg::OnBnClickedOk() 2 { 3
4 HPDF_Doc pdf; 5 HPDF_Font font; 6 HPDF_Page szPage[10115]; 7 HPDF_REAL tw; 8
9 string strPdfContent = "這是一個測試,支持中文"; 10
11 string strPdfName = "XXX.pdf"; 12
13 pdf = HPDF_New(error_handler, NULL); 14
15 if (!pdf) 16 { 17 ::MessageBox(NULL,L"生成pdf錯誤",L"提示",NULL); 18 return ; 19 } 20 //new pdf error,longjmp second parameter is 1, setjmp renturn 1, call HPDF_FREE
21 if (setjmp(env)) 22 { 23 HPDF_Free(pdf); 24 return ; 25 } 26
27 HPDF_UseCNSFonts(pdf); 28 HPDF_UseCNTFonts(pdf); 29 HPDF_UseCNTEncodings(pdf); 30 HPDF_UseCNSEncodings(pdf); 31
32 //support Chinese Song (SimSun)and Chinese black (SimHei)
33 font = HPDF_GetFont(pdf, "SimSun", "GBK-EUC-H"); 34
35
36 for( int i = 0; i < 10115 ; ++i ) 37 { 38 szPage[i] = HPDF_AddPage(pdf); 39
40 HPDF_Page_SetSize(szPage[i], HPDF_PAGE_SIZE_LETTER, HPDF_PAGE_PORTRAIT); 41
42 HPDF_Page_BeginText(szPage[i]); 43
44 HPDF_Page_SetFontAndSize(szPage[i], font, 20); 45
46 tw = HPDF_Page_TextWidth(szPage[i], strPdfContent.c_str()); 47
48 HPDF_Page_MoveTextPos(szPage[i], (HPDF_Page_GetWidth(szPage[i]) - tw) / 2, 49 (HPDF_Page_GetHeight(szPage[i]) - 20 ) / 2); 50
51 HPDF_Page_ShowText(szPage[i], strPdfContent.c_str()); 52
53 HPDF_Page_EndText(szPage[i]); 54
55 } 56
57 HPDF_SaveToFile(pdf, strPdfName.c_str()); 58 HPDF_Free(pdf); 59
60 ::MessageBox(NULL,L"生成結束",L" 提示",NULL); 61 }
pdf文件預覽,這里生成了1萬多頁的XXX.pdf文件

編譯好的release和debug 的dll和lib下載地址,也有static lib,包含頭文件就能使用。
編譯好的庫下載鏈接:http://download.csdn.net/detail/u010085340/9614015
