VS2010制作PDF报表

3 篇文章 0 订阅

VS2010制作PDF报表

一、开发环境

  • 编程环境 VS2010
  • 采用pdflib 9.0.0 库

二、基本实现功能

  • 创建一个PDF文件,并在里面绘制表格

三、基本操作步骤

1. 新建一个基于MFC的对话框工程,添加一个按钮
2. PDFlib库的导入
  • 网上下载PDFlib库,任意版本,最好下载一个破解版本,一般的都有水印。我这里用的是9.0的。解压PDFlib-9.0.0-MSWin64-C-C++(我的操作系统是64位的),一般包含基本例子和文档,还有pdflib库。
  • 将pdflib.lib、pdflib.h、pdflib.hpp、cpp_wrapped.h、pdflib.dll复制到当前工程目录下,同时加载pdflib.lib库(#pragma comment(lib,”pdflib.lib”))
3. 基本代码实现。参考官网例子
/************************************************************************
*功    能:PDF制作报表
*函 数 名:PDFDrawTable
*参    数:无
*返 回 值:错误状态
*作    者:Ywx
/********************************************************************/
int CPDFTestDlg::PDFDrawTable(void)
{
    try 
     {

        int row, col, font, image, tf=-1, tbl=-1;
        int rowmax=38, colmax=9;
        PDFlib p;
        double llx= 50, lly=50, urx=550, ury=800;
        const wstring headertext =L"xx测试系统数据报告";
        wstring result;
        wostringstream optlist;
        wstring tf_text[] ={
            L"序号",
            L"项目名称",
            L"参数名称",
            L"最大值",
            L"最小值",
            L"量纲",
            L"标准值",
            L"测量值",
            L"结果"};
        p.set_option(L"errorpolicy=return");
        optlist.str(L"");
        p.set_option(optlist.str());

        if (p.begin_document(L"table.pdf", L"") == -1) //打开文档
        {
            wcerr << L"Error: " << p.get_errmsg() << endl;
                return 2;
        }
        p.set_info(L"Creator", L"PDFlib starter sample");
        p.set_info(L"Title", L"table");

    /* -------------------- Add table cells -------------------- */

        /* ---------- Row 1: table header (spans all columns) */
        row = 1; col = 1;
        font = p.load_font(L"宋体", L"host", L""); //设置主机上字体

        if (font == -1) 
        {
            wcerr << L"Error: " << p.get_errmsg() << endl;
                return(2);
        }
        //设置字体,合并单元格
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
                    << L" fontsize=18} colspan="<<colmax;
        tbl = p.add_table_cell(tbl, col, row, headertext, optlist.str());
        //---------------------row2----------------------------------------//
        row++;
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=18} colspan=" << colmax ;
        tbl = p.add_table_cell(tbl, col, row, L"xx系统检查装置", optlist.str());
        // --------------------row---------------------------------------- //
        // -----第三行,跨三列*/
        row++;
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=3" ;
        tbl = p.add_table_cell(tbl, col, row, L"xx名称", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=4" ;

        tbl = p.add_table_cell(tbl, col+3, row, L"", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=2" ;
        tbl = p.add_table_cell(tbl, col+7, row, L"xx检测者", optlist.str());
        //---------------------------------row 4 ---------------------------//
        row++;
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=3" ;
        tbl = p.add_table_cell(tbl, col, row, L"xx型号", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=4" ;

        tbl = p.add_table_cell(tbl, col+3, row, L"", optlist.str());
        optlist.str(L"");
        optlist << L"fittextline={position=center font=" << font
            << L" fontsize=12} colspan=2" ;
        tbl = p.add_table_cell(tbl, col+7, row, L"检测日期", optlist.str());
        //--------------row 5 ------------------------------------------//
        row++;
        for(col = 1; col <=colmax;col++)
        {
            optlist.str(L"");
            optlist << L"fittextline={position=center font=" << font
                << L" fontsize=12}" ;
            tbl = p.add_table_cell(tbl, col, row, tf_text[col-1], optlist.str());
        }
        /* ---------- Fill row 5 and above with their numbers */
        for (row++; row <= rowmax; row++)
        {
            for (col = 1; col <= colmax; col++)
            {
                    wostringstream num;
                    optlist.str(L"");
                    optlist << L"colwidth=20% fittextline={font=" << font
                            <<  L" fontsize=10}";

            tbl = p.add_table_cell(tbl, col, row, L"", optlist.str());
            }
        }

        do {
            p.begin_page_ext(0, 0, L"width=a4.width height=a4.height");
            optlist.str(L"");
            optlist <<  L" header=5 rowheightdefault=auto stroke={{line=other linewidth = 0.5}}";
            result = p.fit_table(tbl, llx, lly, urx, ury, 
                           // L"header=4 rowheightdefault=auto "
                           // L"colwidth=20%"
                          //  L"fill={{area=rowodd fillcolor={gray 0.9}}} "
                          L"stroke={{line=other linewidth = 0.5}}");
                        //   optlist.str());
            if (result == L"_error") {
            wcerr << L"Couldn't place table: " << p.get_errmsg() << endl;
                    return 2;
            }

            p.end_page_ext(L"");

        } while (result == L"_boxfull");
        if (result != L"_stop") 
        {
            if (result == L"_error") 
            {
                wcerr << L"Error when placing table: " << p.get_errmsg()
                            << endl;
                    return 2;
            }
           else 
           {

            wcerr << L"User return found in Table" << endl;
                    return 2;
            }
        }
        p.delete_table(tbl, L"");

        p.end_document(L"");
        }
        catch (PDFlib::Exception &ex) {
        wcerr << L"PDFlib exception occurred:" << endl
                  << L"[" << ex.get_errnum() << L"] " << ex.get_apiname()
              << L": " << ex.get_errmsg() << endl;
        return 2;
        }

    return 0;
}

四、总结

  • 本文只是简单的对pdflib进行了一个操作,参考官网例子static_table.cpp修改而来!侵删。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值