• 导出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 }
  • 相关阅读:
    【转】Centos yum 换源
    centos7下使用yum安装mysql
    【转】简易smtp调用类
    【转】Beanstalkd 队列简易使用
    【转】mysql 拖库写库用法
    【转】scp 命令格式
    【转】mac os 安装php
    pip 国内源 gem 国内源
    【转】25个必须记住的SSH命令
    NHibernate 有好几种数据库查询方式
  • 原文地址:https://www.cnblogs.com/xydblog/p/3643315.html
Copyright © 2020-2023  润新知