PDFLib库的使用c++

前言

前段时间接触了个操作pdf的项目,使用PDFlib库对pdf文件添加水印.这里整理一些基础的用法.

资源环境

vs2015下使用pdflib9.1版本的破解库,pdf库在我的网盘中, 提取码 :l1my

基本功能

为了方便查看和整理,这里列举出本文用到的一些功能.

  1. 加载pdflib(输出pdf版本控制)
  2. 把源pdf文件内容绘制到目标pdf文件
    获取pdf文件中的参数
  3. 线条/文字/图片/透明度/旋转/坐标系
  4. RGB颜色值计算

    (如果有空,后续再补充:一维码绘制等)

一.加载pdflib

#include "../pdflib/pdflib.hpp"
#pragma comment(lib,"../pdflib/pdflib.lib")
using namespace pdflib;

这里博主首先把库文件夹下bind/cpp下的主要文件(“cpp_wrapped.h”,“pdflib.h”,“pdflib.hpp”)放到pdflib文件夹下,另外lib也会放入其中.
完了以后就可以创建pdflib对象,所有操作都在这个类的对象中.

	PDFlib m_oPDF;

二.把源pdf文件内容绘制到目标pdf文件

bool PaintPDF()
{
	try
	{
		//创建目标pdf文件准备绘制
		//这里的参数 compatibility=1.4 控制生成pdf的版本号,若不添加参数则默认版本为 1.7
		if (m_oPDF.begin_document(L"c:/Dst.pdf", L"compatibility=1.4") == -1)
		{
			printf(u8"##创建pdf文件失败!");
			return false;
		}
		//打开源pdf文件获取实例id
		int nSrcPDFID = m_oPDF.open_pdi_document(L"c:/Src.pdf", L"");
		if (nSrcPDFID == -1)
		{
			printf(u8"##打开源pdf文件失败!");
			return false;
		}
		//m_oPDF.set_option(L"searchpath={{ print_cache }}");//设置默认路径
		
		//根据SrcPDF实例id获取pdf中的信息
		int endpage = (int)m_oPDF.pcos_get_number(nSrcPDFID, L"length:pages");//总页数
		auto fWidth = (m_oPDF.pcos_get_number(nSrcPDFID, L"pages[0]/width"));//宽度595
		auto fHeight = m_oPDF.pcos_get_number(nSrcPDFID, L"pages[0]/height");//高度842

		/*
		设置字体,若有中文,则中文字体必须是中文字体:如
		int font = m_oPDF.load_font(L"黑体", L"auto", L"");
		并且,后续输出文字内容编码必须是utf8编码
		或者
		在后续输出文字时使用如下字体格式optlist修饰:
		fontname=黑体 fontsize=28 encoding=auto
		*/
		int nFontId = m_oPDF.load_font(L"微软雅黑", L"host", L"");
		if (nFontId == -1)
		{
			printf(u8"##PdfAddWaterMarker, 默认字体(微软雅黑)加载失败!");
			return false;
		}

		//根据源文件的页数,绘制新文件的页面
		for (int pageno = 1; pageno <= endpage; pageno++)
		{
			//获取准备绘制的页面标识
			int page = m_oPDF.open_pdi_page(nSrcPDFID, pageno, L"");
			if (page == -1)
			{
				return false;
			}

			//向文档添加新页,并指定各种选项 L""
			m_oPDF.begin_page_ext(fWidth, fHeight, L"");

			//设置字体
			m_oPDF.setfont(nFontId, 18);

			//中间水印,最先绘制,置于最底层
			addMidWaterMark();

			//页脚
			addHeaderWaterMark();

			//在页面上放置导入的PDF页面,并根据不同的选项进行操作。
			m_oPDF.fit_pdi_page(page, 0, 0, L"adjustpage");

			m_oPDF.end_page_ext(L"");
			m_oPDF.close_pdi_page(page);
		}

		//		m_oPDF.close_font(font);
		m_oPDF.close_pdi_document(nSrcPDFID);
		m_oPDF.end_document(L"");

		return true;
	}
	catch (PDFlib::Exception & e)
	{
		//输出pdflib异常信息
		wprintf(m_oPDF.get_errmsg().c_str());
		return false;
	}
	catch (...)
	{
		//其他异常
		return false;
	}
}

三.线条/文字/图片/透明度/旋转/坐标系

字体风格:
fontname:字体名
fontsize:字体大小
encoding:编码
fillcolor:颜色
fontstyle:加粗
underline:下划线
underlineposition:下划线位置
underlinewidth:下划线宽度
strikeout:删除线
strokecolor:删除线/下划线/上划线颜色
italicangle:斜体(范围: -90~90)

void wWaterMarkWarpper::addHeaderWaterMark()
{
	//绘制横线
	m_oPDF.setcolor(L"stroke", L"rgb", 0.0f, 0.0f, 0.0f, 0.0f);//设置颜色
	m_oPDF.moveto(50, 100);							//设置当前点
	m_oPDF.lineto(300, 100);						//从当前点画一条线
	m_oPDF.stroke();								//用当前颜色绘制,并清除

	//设置透明度
	int gstate = m_oPDF.create_gstate(L"opacityfill=0.3");
	m_oPDF.set_gstate(gstate);
	
	//修改坐标系
	m_oPDF.translate(a4_width / 2, a4_height / 2);
	m_oPDF.rotate(nAngle);

	//绘制文字
	wstringstream wssOpt;
	wssOpt << L"boxsize={" << 600 << L" 50} position={left center}";
	m_oPDF.fit_textline(L"我是页眉水印文字!", 100, 600, wssOpt.str());//center;

	//恢复透明度
	gstate = m_oPDF.create_gstate(L"opacityfill=1");
	m_oPDF.set_gstate(gstate);

	//恢复坐标系
	m_oPDF.rotate(-nAngle);
	m_oPDF.translate(-(a4_width / 2), -(a4_height / 2));
	
	//绘制图片
	wstring wsPicPath = L"c:/2.jpg";
	int nCusImg = m_oPDF.load_image(L"auto", wsPicPath, L"");
	if (nCusImg == -1)
	{
		return;
	}
	auto lCustomWidth = m_oPDF.info_image(nCusImg, L"width", L"");
	wstringstream wssOptP;
	wssOptP << L"boxsize={" << lCustomWidth << L" " << lCustomHeight << L"} position={center} fitmethod=meet";
	m_oPDF.fit_image(nCusImg, 100, 100, wssOptP.str());//option:adjustpage-填充页;scale-缩放
	m_oPDF.close_image(nCusImg);
}

四.RGB颜色计算

根据 RGB颜色查询对照表 可以看到颜色的值,然后把颜色值分三块截取转换成10进制再按照最大值255的比例,即可获取 fillcolor={rgb %0.2f %0.2f %0.2f} 中的三个颜色值

//string(H) -> int(D)
int HextoDec(const string s)
{
		int count = s.length();
		int sum = 0;
		for (int i = count - 1; i >= 0; i--)//从十六进制个位开始,每位都转换成十进制  
		{
			if (s[i] >= '0'&&s[i] <= '9')//数字字符的转换  
			{
				sum += (s[i] - 48)*pow(16, count - i - 1);
			}
			else if (s[i] >= 'A'&&s[i] <= 'F')//字母字符的转换  
			{
				sum += (s[i] - 55)*pow(16, count - i - 1);
			}
		}
		return sum;
}
string TransRGB(string sFontColor)
{
		double colorR = 0.00;
		double colorG = 0.00;
		double colorB = 0.00;
		if (!sFontColor.empty())
		{
			transform(sFontColor.begin(), sFontColor.end(), sFontColor.begin(), ::toupper);
			auto sColorR = sFontColor.substr(0, 2);
			auto sColorG = sFontColor.substr(2, 2);
			auto sColorB = sFontColor.substr(4, 2);
			auto nColorR = HextoDec(sColorR);
			auto nColorG = HextoDec(sColorG);
			auto nColorB = HextoDec(sColorB);
			colorR = nColorR * 1.0 / 255;
			colorG = nColorG * 1.0 / 255;
			colorB = nColorB * 1.0 / 255;
		}
		sprintf(strFont, "fillcolor={rgb %0.2f %0.2f %0.2f}"
			, colorR, colorG, colorB
		);
		return strFont;
}

你可能感兴趣的:(c++,C++,PDF,pdflib,水印)