一 序
最近一段时间需要研究文档操作,首先研究的是PDFlib这个库,奈何官方文档是英文的,好在有第7版有中文的,但其中很多接口都改变了,举个最让我头疼的例子,说好了C++下函数使用方式是 pdf.XXXX()的,实际上使用的是C下的PDF_XXX_(pdf,XXXX)。
对新手来说太不友好了!
我知道很多大神对于这等技术早已掌握,不屑于整理博客,可是工作总要有人来做,那就我来吧!
我的博客倾向于简洁直观,不研究理论(库就是一个轮子,想研究理论看文档,源码),力求给出最简单的方法。
和我一起出发吧!
二 配置环境
系统版本:win8.1
编译器:VS2013
PDFLib库版本:9
1.建立工程==Fuck_PDFlib==, 创建win32程序。工程右键->属性->配置属性->常规->项目默认值->MFC的使用:在共享DLL中使用MFC(因为建的是win32程序,又想使用CString)。
2.将【pdflib.dll】【pdflib.h】【pdflib.dll】放到工程目录下 即C:\Users\你的用户名\Documents\visual studio 2013\Projects\Fuck_PDFlib\Fuck_PDFlib下。
3.工程名,右键->属性->配置属性->连接器->输入->附加依赖项 添加【pdflib.lib】。
三 尝试个例子吧
这个例子来源于http://blog.csdn.net/weixinhum/article/details/47418975 我对其中过时的函数做了修改。例子稍微有些复杂,但只是作为演示使用,效果可以去上面的博客查看效果。在后续的博客中,我会主要以官方的demo来研究使用方式,欢迎交流指正。
CPP中代码如下:
#include "stdafx.h"
#include "pdflib.h"
#include <afxwin.h>
void String2text(PDF *p, int &TextFlow, CString &mPagenameAndDate, int fontsize)
{
char characteristic_cn[100];
int mPagenameAndDateSize = mPagenameAndDate.GetLength();//字符串长度
// PDF_set_parameter(p, "FontOutline", "a=./font/simfang.ttf");//该方法已废弃
PDF_set_option(p, "FontOutline={ a=./font/simfang.ttf }");//这里的“./font/simfang.ttf”为字体文件的存放路径,也就是说需要将字库文件放到相应的位置,不然会造成错
sprintf_s(characteristic_cn, "fontname=a:0 fontsize = %d encoding = unicode textlen = %d", fontsize, mPagenameAndDateSize * 2);//中文字符
PDF_add_textflow(p, TextFlow, (char *)(mPagenameAndDate).AllocSysString(), mPagenameAndDateSize * 2, characteristic_cn);//添加字符段内容
}
void OutputStringToPDF(PDF *p, CString &mPagenameAndDate, int Left, int &Top, int Right, int Reduction, int fontsize)//数据输出
{
//该函数输出数据到PDF中,需要注意的是在输出到页未的时候会自行进行换页
if (Top<130)
{
Top = 740;
PDF_end_page_ext(p, ""); // 关闭页面并开启新的页面
PDF_begin_page_ext(p, a4_width, a4_height, "");
}
int TextFlow = PDF_create_textflow(p, "", 0, "");//创建字符段
String2text(p, TextFlow, mPagenameAndDate, fontsize);
while (true)
{
const char *returnstring = PDF_fit_textflow(p, TextFlow, Left, Top, Right, Top - Reduction, "");
Top -= Reduction;
if (strcmp(returnstring, "_boxfull") != 0)//对象满了
{
break;
}
if (Top<130)
{
Top = 740;
PDF_end_page_ext(p, ""); // 关闭页面并开启新的页面
PDF_begin_page_ext(p, a4_width, a4_height, "");
}
}
PDF_delete_textflow(p, TextFlow);//释放字符串对象
}
void main()
{
PDF *p = NULL;
int Left = 85, Top = 740, Right = a4_width - 85;
//pdf对象创建
if ((p = PDF_new()) == (PDF *)0)
{
printf("Couldn't create PDFlib object (out of memory)!n");
}
PDF_TRY(p)
{
//先创建PDF文档,名为outout.pdf
if (PDF_begin_document(p, "output.pdf", 0, "") == -1)
{
printf("Error: %sn", PDF_get_errmsg(p));
}
//再创建PDF文档里面的页面,并填入页面的内容,这里本人将其封装成了两个函数
PDF_begin_page_ext(p, a4_width, a4_height, "");
CString mPagenameAndDate = L"君不见黄河之水天上来 奔流到海不复回\n";
mPagenameAndDate += L"君不见高堂明镜悲白发 朝如青丝暮成雪\n";
mPagenameAndDate += L"人生得意须尽欢 莫使金樽空对月\n";
mPagenameAndDate += L"天生我材必有用 千金散尽还复来\n";
mPagenameAndDate += L"烹羊宰牛且为乐 会须一饮三百杯\n";
mPagenameAndDate += L"岑夫子 丹丘生 将进酒 杯莫停\n";
mPagenameAndDate += L"与君歌一曲 请君为我倾耳听\n";
mPagenameAndDate += L"钟鼓馔玉不足贵 但愿长醉不复醒\n";
mPagenameAndDate += L"古来圣贤皆寂寞 惟有饮者留其名\n";
mPagenameAndDate += L"陈王昔时宴平乐 斗酒十千恣欢谑\n";
mPagenameAndDate += L"主人何为言少钱 径须沽取对君酌\n";
mPagenameAndDate += L"五花马 千金裘\n";
mPagenameAndDate += L"呼儿将出换美酒 与尔同销万古愁\n";
//将文字输出到PDF,第三个参数为输出的左边距,第四个参数为输出的高度,第五个参数为输出的右边距,第六个参数为行距,第七个则是字体的大小
OutputStringToPDF(p, mPagenameAndDate, Left, Top, Right, 45, 24);
//页结束
PDF_end_page_ext(p, "");
//文档结束
PDF_end_document(p, "");
}
PDF_CATCH(p)//错误信息输出
{
printf("[%d] %s: %sn", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p));
PDF_delete(p);
}
PDF_delete(p);
system("output.pdf");
}