一、简介

本次是利用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;

}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐