c/c++利用ghostscript API打印机pdf文件
·
一、简介
本次是利用ghostscript的api接口实现打印pdf文件的功能;
安装包和源码地址:https://github.com/ArtifexSoftware/ghostpdl-downloads/releases
API文档:https://www.ghostscript.com/doc/9.27/API.htm
命令行参数说明:https://www.ghostscript.com/doc/9.27/Use.htm

二 测试实例
1.根据自己的编译环境设置引入ierrors.h、iapi.h (在源码文件psi目录下)和lib 文件(不想源码编译,可使用exe安装包bin目录下的gsdll32.lib 、gsdll32.dll)
2.测试代码
#ifdef _WIN32 && !_Windows
#define _Windows
#endif // _WIN32
#ifdef _Windows
# define GSDLLEXPORT __declspec(dllimport)
#endif
#include <stdio.h>
#include "ierrors.h"
#include "iapi.h"
//gsapi_revision_t gsv; /// 版本信息
void *mInstance; /// 实例
//! stdio functions
static int GSDLLCALL gsdll_stdin(void *instance, char *buf, int len)
{
int ch;
int count = 0;
while (count < len) {
ch = fgetc(stdin);
if (ch == EOF)
return 0;
*buf++ = ch;
count++;
if (ch == '\n')
break;
}
return count;
}
static int GSDLLCALL gsdll_stdout(void *instance, const char *str, int len)
{
fwrite(str, 1, len, stdout);
fflush(stdout);
return len;
}
static int GSDLLCALL gsdll_stderr(void *instance, const char *str, int len)
{
fwrite(str, 1, len, stderr);
fflush(stderr);
return len;
}
#define QUIET_PRINT_INDEX_NUM 10
int GSApiQuietPrint()
{
int res,Eres;
int nGSargc;
char* GSargv[QUIET_PRINT_INDEX_NUM];
//! 静默打印不弹出打印设置对话框
nGSargc = QUIET_PRINT_INDEX_NUM;
GSargv[0] = "pdfprint"; /// 没有实际作用
GSargv[1] = "-sDEVICE=mswinpr2"; /// 打印设备
GSargv[2] = "-dPrinted=false"; ///
GSargv[3] = "-sPAPERSIZE=a4"; /// 设置纸张
GSargv[4] = "-dPDFFitPage"; /// 自适应页面大小
GSargv[5] = "-sPDFPassword=\"\""; /// pdf文件密码
GSargv[6] = "-dBATCH"; /// 批量
GSargv[7] = "-dNOPAUSE"; /// 无停顿
GSargv[8] = "-sOutputFile=\"%printer%Brother MFC-L2710DW series\""; /// %printer%打印机名称
GSargv[9] = "D:\\ddPrinter\\ddPrinter_x64\\11.pdf"; ///目标文件
printf("\n------- Quiet Print ----------- \n");
for(int i=0;i<nGSargc;i++)
printf("%s ", GSargv[i]);
printf("\n");
res = gsapi_new_instance(&mInstance,NULL);
if(res < 0)
return 1;
gsapi_set_stdio(mInstance, gsdll_stdin, gsdll_stdout, gsdll_stderr);
res = gsapi_set_arg_encoding(mInstance, GS_ARG_ENCODING_UTF8);
if (res == 0)
res = gsapi_init_with_args(mInstance, nGSargc, GSargv);
Eres = gsapi_exit(mInstance);
if ((res == 0) || (res == gs_error_Quit))
res = Eres;
gsapi_delete_instance(mInstance);
mInstance = NULL;
if ((res == 0) || (res == gs_error_Quit))
return 0;
return 1;
}
#define PRINT_INDEX_NUM 5
int GSApiPrint()
{
int res,Eres;
int nGSargc;
char* GSargv[PRINT_INDEX_NUM];
//! 非静默打印, 弹出打印设置对话框
nGSargc = PRINT_INDEX_NUM;
GSargv[0] = "pdfprint"; /// 没有实际作用
GSargv[1] = "-sDEVICE=mswinpr2"; /// 打印设备
GSargv[2] = "-dBATCH";
GSargv[3] = "-dNOPAUSE";
GSargv[4] = "D:\\ddPrinter\\ddPrinter_x64\\src.pdf";
printf("\n------- Print ----------- \n");
for(int i=0;i<nGSargc;i++)
printf("%s ", GSargv[i]);
printf("\n");
res = gsapi_new_instance(&mInstance,NULL);
if(res < 0)
return 1;
gsapi_set_stdio(mInstance, gsdll_stdin, gsdll_stdout, gsdll_stderr);
res = gsapi_set_arg_encoding(mInstance, GS_ARG_ENCODING_UTF8);
if (res == 0)
res = gsapi_init_with_args(mInstance, nGSargc, GSargv);
Eres = gsapi_exit(mInstance);
if ((res == 0) || (res == gs_error_Quit))
res = Eres;
gsapi_delete_instance(mInstance);
mInstance = NULL;
if ((res == 0) || (res == gs_error_Quit))
return 0;
return 1;
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)