本教程展示了如何创建一个Windows C/ c++ API应用程序,该应用程序使用LEADTOOLS SDK编写PDF417 AAMVA标准条形码。
概述 | |
---|---|
总结 | 本教程介绍如何在Windows C DLL应用程序中使用LEADTOOLS AAMVA Builder SDK技术。 |
完成时间 | 30分钟 |
Visual Studio项目 | 下载教程项目(20kb) |
平台 | Windows C DLL应用程序 |
IDE | Visual Studio 2017, 2019 |
开发许可 | 下载LEADTOOLS |
用另一种语言试试 |
|
在开始之前编写AAMVA驾照条码- Windows C DLL教程,熟悉创建项目和加载/显示图像的基本步骤添加引用和设置License而且加载,显示和保存图像教程。
中创建的64位Windows API项目的副本加载,显示和保存图像教程。如果项目不可用,请按照该教程中的步骤创建它。
要使用LEADTOOLS构建AAMVA数据并编写条形码,请添加所需的头文件和DLL文件。打开预编译的头文件(或pch.h
或stdafx.h
,取决于所使用的Visual Studio版本),并添加以下行:
# include“C: \ LEADTOOLS22 \ \ Ltbar.h包括”
#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltbar_x.lib”)//条形码和AAMVA支持
请注意
有关特定工具箱功能或文件格式所需dll的完整列表,请参阅你的申请中包含的文件.
有关所需的Barcode dll的详细信息,请参阅帮助主题应用程序中包含的条形码文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱功能之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中更详细地介绍了添加LEADTOOLS引用和设置许可添加引用和设置License教程。
创建项目、添加引用、设置许可证以及添加加载和显示图像代码之后,就可以开始编码了。
以下步骤适用于Visual Studio 2019;对于Visual Studio的其他版本,它们可能有所不同。
去解决方案资源管理器双击资源文件(.rc)。
添加一个新的条形码菜单旁边的下拉菜单文件菜单。在新增的条形码菜单,添加&写入AAMVA条形码菜单项。新项目的ID应该是ID_BARCODE_WRITEAAMVABARCODE
.
去指向
函数和开关(wmId)
语句的下面WM_COMMAND
Case,添加一个新的Case:
开关(wmId)
{
情况下ID_BARCODE_WRITEAAMVABARCODE:
{
//创建一个空的位图并用浅色填充
BITMAPHANDLE BarcodeBmp = {0};
intW = 700 h = 450;
L_CreateBitmap (&BarcodeBmp运算符LEADBmp, TYPE_CONV, w, h, 24, ORDER_BGR, NULL, BOTTOM_LEFT, NULL, 0);
BarcodeBmp。XResolution = BarcodeBmp。YResolution = 200;
L_FillBitmap(&BarcodeBmp, RGB(255,200,150));
L_CHAR*数据= NULL;
L_UINT数据长度= 0;
L_INT nRet = SetAAMVAIDInformation(&data, &dataLength);
如果(nRet != SUCCESS)
{
对话框(hWnd,文本("设置AAMVA信息错误"),文本(“条形码演示”), MB_ICONERROR);
如果(数据)
L_BarCodeAAMVAMemoryFree(数据);
打破;
}
如果(WritePdf417Barcode(hWnd, &BarcodeBmp, data, dataLength) == SUCCESS)
{
如果(LEADBmp.Flags.Allocated)
L_FreeBitmap (&LEADBmp);
LEADBmp = BarcodeBmp;//复制结构而不复制图像数据
InvalidateRect(hWnd, NULL, TRUE);
}
如果(数据)
L_BarCodeAAMVAMemoryFree(数据);
}
打破;
//保留其余的代码
添加一个新的SetAAMVAIDInformation
函数并向其添加以下代码。这个函数可以放在指向
功能:
(L_CHAR** pData, L_UINT* pDataLength)
{
AAMVAIDBUILDER Builder = {0};
L_INT nRet = L_BarCodeAAMVAIDBuilderInit(&Builder);
如果(nRet != SUCCESS)返回nRet;
nRet = l_barcodeaamvaidbuilderset管辖权(&Builder, L_AAMVA_JURISDICTION_PENNSYLVANIA, NULL);
如果(nRet != SUCCESS)返回nRet;
nRet = l_barcodeaamvaidbuilderset司法权版本(&Builder,“00”);
如果(nRet != SUCCESS)返回nRet;
nRet = L_BarCodeAAMVAIDBuilderSetVersion(&Builder, L_AAMVA_VERSION_2016);
如果(nRet != SUCCESS)返回nRet;
nRet = L_BarCodeAAMVAIDBuilderSetNumberOfEntries(&Builder, 1);
如果(nRet != SUCCESS)返回nRet;
nRet = L_BarCodeAAMVAIDBuilderSetSubfileType(&Builder, 0, L_AAMVA_SUBFILE_TYPE_DL, NULL);
如果(nRet != SUCCESS)返回nRet;
//添加每个AAMVA cd所需的所有数据元素
//可以对枚举D20类型的数据元素值使用L_BarCodeAAMVAIDLookup*函数
//宏声明一个日期字符串变量,并用日期填充它
//日期值等于今天的数据向前或向后偏移数年
# DeclareDate(szVar, nYearOffset) \
字符szVar [9];\
strcpy_s(szVar, 9, GetCurrentDate(nYearOffset))
//下面的例子使用日期值为17岁的人
DeclareDate (szNow 0);//今天的日期
DeclareDate (szExpiry 6);// 6年后到期
DeclareDate (szBirthday, -17);// 17年前出生
DeclareDate (szBirthPlus21 4);//再过4年就21岁了
DeclareDate (szBirthPlus19 2);//再过两年我就19岁了
DeclareDate (szBirthPlus18, 1);//再过一年就满18岁了
常量字符* driversLicenseData[][2] = {
{“地区指定基金”,“N”},//名字截断(N =未截断)
{“DDE”,“N”},//姓氏截断(N =未截断)
{“常规心电图”,“美国”},//国家识别
{“贴现”,“没有”},//文档标识符
{“数据收集”,“1234567890”},// ID
{“驿站”,“123456”},//邮政编码
{“DAJ”,“啪”},//地址管辖代码
{“戴”,“任何城市”},//地址
{“DAG”,“大街123号”},//地址
{“道”,“072年”},//高度(英寸或厘米)
{“天”,“兄弟”},//眼睛颜色
{“DBC”,“1”},//性别(男= 1,女= 2,9 =未指定)
{“数据备份系统”szBirthday},//出生日期
{“DBD”szNow},//文档发布日期
{“爸爸”,“没有”},//中间名
{“DAC”,“约翰。”},//名字
{“DCS”,“母鹿”},//姓氏
{“DBA”szExpiry},//截止日期
{“民国”,“M”},//司法管辖区特定背书代码
{“DCB”,“没有”},//司法管辖区限制代码
{“DCA”,“C”},//管辖车辆类别
{“最大”szBirthPlus21},//未满21岁
{“DDI”szBirthPlus19},//未满19岁
{“DDH”szBirthPlus18},//未满18岁
{“戴兹”,“兄弟”}//头发颜色
};
intelementCount =运算符driversLicenseData /运算符driversLicenseData [0];
为(intI = 0;i < elementCount;+ + i)
{
L_UINT valueLen = (L_UINT)strlen(driversLicenseData[i][1]);
nRet = L_BarCodeAAMVAIDBuilderAddDataElementToSubfile(&Builder, 0, driverlicensedata [i][0], driverlicensedata [i][1], valueLen);
如果(nRet != SUCCESS)返回nRet;
}
nRet = L_BarCodeAAMVAIDBuilderBuild(&Builder);
如果(nRet != SUCCESS)返回nRet;
//有效的AAMVAID现在在pBuilder->OutputID
nRet = L_BarCodeWriteAAMVAData(生成器。OutputID, pData, pDataLength);
L_BarCodeFreeAAMVAID (Builder.OutputID);
返回nRet;
}
添加一个名为GetDatePlusYears
它返回具有指定偏移年数的当前日期。返回日期的任何函数名称Format可以代替它。
# include < time.h >
L_CHAR * GetDatePlusYears (intnYears)
{
静态字符currentDate [9];
time_t t = time(NULL);
结构体Tm local_t = {0};
localtime_s (&local_t科技);
wsprintfA (currentDate2.2 2.2 4.4“% d % d % d”, local_t。tm_year + 1900 + nYears, local_t。Tm_mon + 1, local_t.tm_mday);
返回currentDate;
}
添加一个新的WritePdf417Barcode
函数,在成功构建AAMVA数据后将条形码写入图像,并向其添加以下代码:
L_INT WritePdf417Barcode(HWND HWND, pBITMAPHANDLE pBarcodeBmp, L_CHAR* pData, L_INT nDataLen)
{
L_INT nRet = L_BarCodeInit(BARCODES_PDF_WRITE);
如果(nRet != SUCCESS)
返回nRet;
BARCODEDATA = {0};
BARCODECOLOR BarColor = {0};
BARCODEWRITEPDF BarCodePDF = {0};
BarColor。uStructSize =运算符BARCODECOLOR;
BarColor。dwColorBar = RGB(0,0,0);
BarColor。dwColorSpace = RGB(255, 255, 255);
BarCodeData。uStructSize =运算符BarCodeData;
BarCodeData.rcBarLocation.left = 50;
BarCodeData.rcBarLocation.top = 50;
BarCodeData.rcBarLocation.right = 650;
BarCodeData.rcBarLocation.bottom = 400;
BarCodeData。nUnits = BARCODE_SCANLINES_PER_PIXELS;
BarCodeData。ulType = BARCODE_PDF417;
BarCodeData。pszBarCodeData = pData;
BarCodeData。nSizeofBarCodeData = nDataLen;
BarCodePDF。uStructSize =运算符BarCodePDF;
BarCodePDF。wModule = 15;
BarCodePDF。wModAspectRatio = 3;
BarCodePDF。wEccLevel = BARCODE_PDF417_ECCLEVEL_5;
BarCodePDF。wAspectWidth = 4;
//写入条码
nRet = L_BarCodeWrite(pBarcodeBmp, &BarCodeData, &BarColor, BARCODE_USECOLORS, NULL, &BarCodePDF, NULL, NULL, NULL, NULL, NULL, NULL);
如果(SUCCESS != nRet)
对话框(hwnd,文本("无法写入PDF417条码"),文本(“条形码演示”), MB_ICONERROR);
L_BarCodeExit ();
返回nRet;
}
按下运行项目F5,或选择Debug ->开始调试.
如果正确地执行了这些步骤,应用程序将运行并允许用户进行选择条形码->写AAMVA条形码来创建一个空的位图,并将AAMVA数据写入其中。
生成的图像如下所示:
方法的使用AAMVAIDBUILDER
结构和相关的构建器和条形码编写器功能。