VS2010制作PDF报表
一、开发环境
- 编程环境 VS2010
- 采用pdflib 9.0.0 库
二、基本实现功能
三、基本操作步骤
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. 基本代码实现。参考官网例子
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");
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());
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++;
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++;
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++;
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());
}
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"stroke={{line=other linewidth = 0.5}}");
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修改而来!侵删。