MFC--利用Haru库生成PDF文件

本文介绍如何使用HarufreePDF库生成PDF文件。详细步骤包括文档对象初始化、设置文档属性、创建页面并绘制文本及线条等。适用于希望快速上手HarufreePDF库的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

haru free pdf类库下载地址:

http://download.youkuaiyun.com/detail/u011642774/9616781

解压后我们要用到三个东西:
libhpdf.dll
libhpdf.lib
include整个文件夹

解压后复制libhpdf.dll到项目的release和debug目录下;
libhpdf.lib和include文件夹直接复制到源文件目录下;

在xxxDlg.cpp里添加下面两句:

#include "include/hpdf.h"
#pragma comment(lib, "libhpdf.lib")

典型的编程流程:见压缩包中的how_to_use.html文件:

大致分为5个步骤:见下面程序的1~5

BOOL CxxxSystemDlg::GeneratePDF(…… )
{
	//1.初始化文档对象////////////////////////////////////////////////////////////////////////////////
	HPDF_Doc pdf;
	pdf=HPDF_New(error_handler,NULL);
	if(!pdf)
	{
		AfxMessageBox("错误:创建PDF失败!");
		return FALSE;
	}
	if(setjmp(env) )
	{
		HPDF_Free(pdf);
		AfxMessageBox("错误:生成PDF过程中遇见错误!");
		return FALSE;
	}

	//2.设置文档对象/////////////////////////////////////////////////////////////////////////////////
	//set compression mode 
	HPDF_SetCompressionMode(pdf,HPDF_COMP_ALL);
	//set page mode to use outlines
	HPDF_SetPageMode(pdf,HPDF_PAGE_MODE_USE_OUTLINE);

	//3.创建Page对象////////////////////////////////////////////////////////////////////////////////
	HPDF_Page page;
	page=HPDF_AddPage(pdf);
	HPDF_Page_SetSize(page,HPDF_PAGE_SIZE_A4,HPDF_PAGE_PORTRAIT);
	///HPDF_PAGE_SIZE_A4  595*841(in pixel)
	///HPDF_PAGE_LANDSCAPE A4倒方向 ;HPDF_PAGE_PORTRAIT 正向方向

	///3.1输出字符串//////////////////////////////////////////////
	CString str_Showtxt;
        HPDF_Page_BeginText (page);
	    ///使用条件:当前graphics mode为HPDF_GMODE_PAGE_DESCRIPTION,函数将当前模式改为HPDF_GMODE_TEXT_OBJECT
		///开始text对象,设置当前text的位置到点(0,0)
	HPDF_Font font;
	/* get default font */
	HPDF_UseCNSFonts(pdf);
	HPDF_UseCNSEncodings(pdf);
        font=HPDF_GetFont(pdf,"SimSun","GB-EUC-H");///SimSun宋体、SimHei黑体

	///显示报告标题
	HPDF_Page_SetFontAndSize (page, font, 24);//注:字体显示的起始位置指字体左下角的位置
	HPDF_Page_MoveTextPos (page, HPDF_Page_GetWidth(page)/4, HPDF_Page_GetHeight(page)-60);
		/////使用条件:graphics mode of the page is in HPDF_GMODE_TEXT_OBJECT
		/////当前位置(x1,y1),HPDF_Page_MoveTextPos (page, x ,y)移动后的位置(x1+x,y1+y)
	str_Showtxt="xxx检测结果";
	HPDF_Page_ShowText (page, str_Showtxt);///显示字符串方法1
	
	CTime Curtime;
	Curtime=CTime::GetCurrentTime();
	CString strCurT,time1,time2;
	time1=Curtime.Format("%Y-%m-%d,");
	time2=Curtime.Format("%H:%M:%S");
	strCurT=time1+time2;
	///显示测试时间
	HPDF_Page_SetFontAndSize (page, font, 12);
	HPDF_Page_TextOut(page,HPDF_Page_GetWidth(page)*3/4, HPDF_Page_GetHeight(page)-80,strCurT);///显示字符串方法2


	
        HPDF_Page_EndText (page);
	   ///将graphics mode 改为:HPDF_GMODE_PAGE_DESCRIPTION
	   ///必须有HPDF_Page_BeginText (page);HPDF_Page_EndText (page);否则保存PDF失败。


	///3.2 画线/////////////////////////////////////////////////
	///画线4步骤:设置、起点、LineTo、Stroke
	int i=0;
	///*3.2.1 Draw horizontal lines. */
	///设置线宽
        HPDF_Page_SetLineWidth (page, 0.5);
	//起点
	HPDF_Page_MoveTo (page, 50, HPDF_Page_GetHeight(page)-90);//横线1
	//画线
        HPDF_Page_LineTo (page, HPDF_Page_GetWidth(page)-50, HPDF_Page_GetHeight(page)-90);
	
	///* 3.2.2 Draw vertical lines. */
	HPDF_Page_MoveTo (page, 50, HPDF_Page_GetHeight(page)-90);//第一根竖线
	HPDF_Page_LineTo (page, 50, HPDF_Page_GetHeight(page)-495);
	
	///画线结束
	///change the graphics to HPDF_GMODE_PAGE_DESCRIPION
	HPDF_Page_Stroke (page);
		
	//4.Save PDF//////////////////////////////////////////////////////////////////////////////////////
	///字符数组拼接字符串的方法:///char fname[256]; strcpy (fname, argv[0]); strcat (fname, ".pdf");
	///文件夹必须是之前创建好的,如果文件夹不存在,不会自动创建
	///路径不存在就创建,PathFileExists检验路径是否有效,有效返回true
	if (!PathFileExists("D:\\MacTestResult\\"))
	{//当天保存目录
		_mkdir("D:\\MacTestResult\\");
	}
	CString Save_path;
	Save_path="D:\\MacTestResult\\"+time1+"xxx.pdf";
	///
	HPDF_SaveToFile(pdf,Save_path);

	//5.Cleanup////////////////////////////////////////////////////////////////////////////////////////

	HPDF_Free(pdf);

	/////////////////////////////////
	return TRUE;
}

使用过程中有如下注意:

      1.Graphics mode :不同的方法需要不同的mode,通过相关函数改变mode。

      2.坐标原点为屏幕左下角

      3.颜色通过(r,g,b)调节,有效值0~1.
更加详尽的使用方法见压缩包中doc文件夹中的内容及相关例程。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值