1 PDFLib9的安装 及 demo

一 序

最近一段时间需要研究文档操作,首先研究的是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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值