导出pdf功能

  本程序下载地址:

  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 }
原文地址:https://www.cnblogs.com/xydblog/p/3643315.html