PDF是我們極其常用的文件格式,但對如何生成PDF,個人一直覺得很神秘,其實利用一些公開的PDF庫,我們就可以直接生成PDF文件,而不用關注PDF文件的內部細節。我知道的PDF庫有如CARIO和HARU。
HARU是一款免費的,跨平台的,開源的生成PDF的庫。支持嵌入PNG、JPEG圖片,支持CJK字體編碼。用C語言編寫,因此可以在C/C++中調用。HARU也提供了Ruby,Delphhi,和C#的捆綁(binding)。項目主頁見http://libharu.sourceforge.net/index.html
對於HARU這個開源的PDF庫,我們沒必要深究具體代碼的實現, 只需要使用它提供的接口: 如何創建一個PDF, 設置PDF寬高,保存PDF等就可以了。
下面通過一個例子:使用HARU開源庫,實現把圖片轉為pdf功能。
程序運行界面:點擊導出pdf,將會把圖片轉為pdf。
具體導出PDF響應函數過程如下:
1 void CPdfDlg::OnBtnExportPdf() 2 { 3 // TODO: Add your control notification handler code here 4 5 //生成的pdf名稱 6 CString strDlgPathName = "E:\\123.pdf"; 7 8 //需要轉換的圖片 9 CString strImage = "E:\\002.jpg"; 10 11 //臨時生成的圖片 12 CString strImageTemp = "E:\\000.jpg"; 13 14 //新建PDF文檔,error_handler為錯誤響應函數 15 HPDF_Doc pExportPdf = HPDF_New (error_handler, NULL); 16 17 if (NULL == pExportPdf) 18 return; 19 20 CxImage xImage; 21 22 //E:\\002.jpg圖片格式為3,可以用其它函數獲取不同類型圖片的格式ID 23 int nType = 3; 24 xImage.Load(strImage,nType); 25 26 //臨時生成jpg圖片 27 xImage.Save(strImageTemp,CXIMAGE_FORMAT_JPG); 28 29 HPDF_Page page = HPDF_AddPage (pExportPdf); 30 double imageH = xImage.GetHeight(); 31 double imageW = xImage.GetWidth(); 32 HPDF_Image jpgImage = HPDF_LoadJpegImageFromFile (pExportPdf, strImageTemp); 33 HPDF_Page_SetWidth (page, HPDF_Image_GetWidth (jpgImage)); 34 HPDF_Page_SetHeight (page, HPDF_Image_GetHeight(jpgImage)); 35 HPDF_Page_DrawImage (page, jpgImage, 0, 0,HPDF_Image_GetWidth (jpgImage),HPDF_Image_GetHeight (jpgImage)); 36 37 //刪除臨時生成的圖片 38 DeleteFile(strImageTemp); 39 40 //保存pdf 41 HPDF_SaveToFile (pExportPdf,strDlgPathName); 42 43 if (NULL != pExportPdf) 44 { 45 HPDF_Free (pExportPdf); 46 } 47 }
在使用HPDF_New (error_handler, NULL)這個函數新建一個PDF時,需要指定錯誤響應函數,也就是創建失敗后會執行的函數。
這個錯誤處理函數函數原型為:
( HPDF_STDCALL * HPDF_Error_Handler )(HPDF_STATUS error_no, HPDF_STATUS detail_no, void *user_data);
我們可以返照這個函數原型,寫出一個錯誤響應函數:
1 //PDF錯誤處理回調 2 void __cdecl CPdfDlg::error_handler(HPDF_STATUS error_no,HPDF_STATUS detail_no,void *user_data) 3 { 4 //在此可以拋出異常 5 }