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 }