打印机端口检测(minotr port)安装

本文介绍了一种使用虚拟打印机方法创建PDF刻录机的技术,使应用程序能通过简单的打印操作生成PDF文件。文中详细介绍了安装PostScript打印机、配置RedMon端口监视器及Ghostscript的过程。

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



示例图像 -  PDFWriter1.jpg

介绍

本文的主要目的是演示如何使用虚拟打印机方法创建PDF刻录机,这使您的应用程序能够通过简单的“打印”生成PDF文件。我很确定有很多PDF作者使用相同的技术,如PrimoPDF但是,您可能希望自己创建自己的PDF作者。在这里,我举一个例子来揭示创建这样一种PDF作者的整个过程。

背景

  • Ghostscript是PDF文件的解释器,它还具有将PostScript语言文件转换为PDF的功能。
  • RedMon是一个端口监视器,它将一个特殊的打印机端口重定向到Ghostscript。

主要的想法其实很简单。您需要做的是安装PostScript打印机,让RedMon作为打印机和Ghostscript之间的桥梁。

使用代码

在跳到演示项目之前

你必须先下载Ghostscript。我的演示需要AFPL Ghostscript 8.53此时不要安装。鼓励您使用WinRAR或WinZip(我没有尝试WinZip)将其解压缩到“ C:\\ UTReportPrerequisite \\ gs \\ ”。您需要将pdfwrite.rsp(一个可以在演示项目中找到的文本文件)复制到文件夹中。

您可以从其网站下载RedMon,但我建议您使用演示项目中包含的替换。在演示项目中有一个文件夹“ redmon 17”,请将此文件夹复制到“ C:\\ UTReportPrerequisite \\ ”。

最后一件事是打印机驱动程序。有机会,我选择了HP Color LaserJet 8550 PostScript驱动程序此时不要安装。而是使用WinRAR将所有文件解压缩到“ c:\\ UTReportPrerequisite \\ Driver ”。

最终的文件夹结构应如下所示:

示例截图

运行演示项目

演示项目非常简单。如下图所示,如果每个步骤都已成功完成,则从“Setp1”,“Step2”,“Step3”到“Setp4”的单击按钮,将安装名为“ UTReport PDF Writer ” 的打印机我想在这里指出,“Step3”和“Step4”有点耗时,所以应该多加耐心。

示例截图

现在是正确的时间来测试我们的PDF作者。打开WordPad.exe,输入您想要的任何内容,然后使用“UTReport PDF Writer”打印。检查C:\ SampleOut.PDF,这是您的输出PDF文件。

“Step5”到“Setp8”让您有机会卸载您刚刚安装的打印机。

兴趣点

  1. AddPrinterDriver

    基于MSDN:在应用程序调用该AddPrinterDriver函数之前,必须将驱动程序所需的所有文件复制到系统的printer-driver目录。应用程序可以通过调用该GetPrinterDriverDirectory函数来检索此目录的名称因此,在我们的演示中,我们必须将所有打印机驱动程序文件从c:\\ UTReportPrerequisite \\ Driver复制到返回的文件夹GetPrinterDriverDirectory

    //Install Driver
    
    void CInstallPrinterDlg::OnBnClickedButtonStep3()
    {
        CString msg="Failed";
        if (CopyPrintDriverFiles2System() && AddPrinterDriver())
            msg = "Add Printer Driver Successfully";
        
        AfxMessageBox(msg);
    
        return ;
    }

    另一个棘手的事情是pDependentFiles领域DRIVER_INFO_3从MSDN:pDependentFiles指向一个以空字符结尾的字符串的指针,该字符串指定驱动程序所依赖的文件。字符串中的每个文件名也被终止为空(例如,“ Pscript.dll \ 0Qms810.PPD \ 0Pscrptui.dll \ 0Pspcriptui.h​​lp \ 0Pstest.txt \ 0 \ 0 ”)。我们如何为此字段分配一个值?我的答案是:

    DRIVER_INFO_3 di3; 
    ...
    di3.pDependentFiles = TEXT("hpbafd32.dll\0hpbftm32.dll\0HPLJ8550.cfg\" 
                               "0hpcdmc32.dll\0hpbcfgre.dll\0hpdcmon.dll\0\0");
  2. 更新注册表

    为了让我们的PDF 编写器工作像一个魅力,我们必须更新Ghostscript和RedMon的注册表信息对于RedMon

    //#define PORT_KEY TEXT("SYSTEM\\ControlSet001\\Control\\"
    //                      "Print\\Monitors\\Redirected Port\\Ports\\UTReportPDFPort:")
    
    if ((rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, PORT_KEY, 0, 
                           KEY_ALL_ACCESS, &hkey)) != ERROR_SUCCESS) 
    {
        /* failed to open key, so try to create it */
        rc = RegCreateKey(HKEY_LOCAL_MACHINE, PORT_KEY, &hkey);
    }
    if (rc == ERROR_SUCCESS) 
    {
        lstrcpy(buffer, "@c:\\UTReportPrerequisite\\gs\\pdfwrite.rsp -");
        RegSetValueEx(hkey, TEXT("Arguments"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        lstrcpy(buffer, "C:\\UTReportPrerequisite\\gs\\gs8.53\\bin\\gswin32c.exe");
        RegSetValueEx(hkey, TEXT("Command"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        dwValue =2;
        RegSetValueEx(hkey, TEXT("ShowWindow"), 0, 
                                 REG_DWORD,(CONST BYTE *)&dwValue, 4);
    
        dwValue =0;
        RegSetValueEx(hkey, TEXT("RunUser"), 0, REG_DWORD,
                                (CONST BYTE *)&dwValue, 4);
    
        dwValue =300;
        RegSetValueEx(hkey, TEXT("Delay"), 0, REG_DWORD,
                     (CONST BYTE *)&dwValue, 4);
    
        RegCloseKey(hkey);
    }

    对于Ghostscript:

    //#define GHOSTSCRIPT_KEY2 TEXT("SOFTWARE\\AFPL Ghostscript\\8.53")
    
    if ((rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, GHOSTSCRIPT_KEY2, 0, 
                           KEY_ALL_ACCESS, &hkey)) != ERROR_SUCCESS) 
    {
        /* failed to open key, so try to create it */
        rc = RegCreateKey(HKEY_LOCAL_MACHINE, GHOSTSCRIPT_KEY2, &hkey);
    }
    
    if (rc == ERROR_SUCCESS) 
    {
        lstrcpy(buffer, TEXT("C:\\UTReportPrerequisite\\gs\\gs8.53\\bin\\gsdll32.dll"));
        RegSetValueEx(hkey, TEXT("GS_DLL"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        lstrcpy(buffer, TEXT("C:\\UTReportPrerequisite\\gs\\gs8.53\\lib;C:\\" 
                             "UTReportPrerequisite\\gs\\fonts;C:\\UTReportPrerequisite" 
                             "\\gs\\gs8.53\\Resource"));
        RegSetValueEx(hkey, TEXT("GS_LIB"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        RegCloseKey(hkey);
    }
  3. 关于pdfwrite.rsp

    pdfwrite.rsp实际上是用于控制PDF生成的参数文件,即页面大小,分辨率等-sOutputFile,用于控制生成的PDF文件应该在哪里。有关详细信息,请阅读Ghostscript在线帮助。

    -Ic:\UTReportPrerequisite\gs\gs8.53\lib;c:\UTReportPrerequisite\gs\fonts
     -sDEVICE=pdfwrite
     -r600
     -dNOPAUSE
     -dSAFER
     -sPAPERSIZE=letter
     -sOutputFile="c:\SampleOut.PDF"

示例图像 -  PDFWriter1.jpg

介绍

本文的主要目的是演示如何使用虚拟打印机方法创建PDF刻录机,这使您的应用程序能够通过简单的“打印”生成PDF文件。我很确定有很多PDF作者使用相同的技术,如PrimoPDF但是,您可能希望自己创建自己的PDF作者。在这里,我举一个例子来揭示创建这样一种PDF作者的整个过程。

背景

  • Ghostscript是PDF文件的解释器,它还具有将PostScript语言文件转换为PDF的功能。
  • RedMon是一个端口监视器,它将一个特殊的打印机端口重定向到Ghostscript。

主要的想法其实很简单。您需要做的是安装PostScript打印机,让RedMon作为打印机和Ghostscript之间的桥梁。

使用代码

在跳到演示项目之前

你必须先下载Ghostscript。我的演示需要AFPL Ghostscript 8.53此时不要安装。鼓励您使用WinRAR或WinZip(我没有尝试WinZip)将其解压缩到“ C:\\ UTReportPrerequisite \\ gs \\ ”。您需要将pdfwrite.rsp(一个可以在演示项目中找到的文本文件)复制到文件夹中。

您可以从其网站下载RedMon,但我建议您使用演示项目中包含的替换。在演示项目中有一个文件夹“ redmon 17”,请将此文件夹复制到“ C:\\ UTReportPrerequisite \\ ”。

最后一件事是打印机驱动程序。有机会,我选择了HP Color LaserJet 8550 PostScript驱动程序此时不要安装。而是使用WinRAR将所有文件解压缩到“ c:\\ UTReportPrerequisite \\ Driver ”。

最终的文件夹结构应如下所示:

示例截图

运行演示项目

演示项目非常简单。如下图所示,如果每个步骤都已成功完成,则从“Setp1”,“Step2”,“Step3”到“Setp4”的单击按钮,将安装名为“ UTReport PDF Writer ” 的打印机我想在这里指出,“Step3”和“Step4”有点耗时,所以应该多加耐心。

示例截图

现在是正确的时间来测试我们的PDF作者。打开WordPad.exe,输入您想要的任何内容,然后使用“UTReport PDF Writer”打印。检查C:\ SampleOut.PDF,这是您的输出PDF文件。

“Step5”到“Setp8”让您有机会卸载您刚刚安装的打印机。

兴趣点

  1. AddPrinterDriver

    基于MSDN:在应用程序调用该AddPrinterDriver函数之前,必须将驱动程序所需的所有文件复制到系统的printer-driver目录。应用程序可以通过调用该GetPrinterDriverDirectory函数来检索此目录的名称因此,在我们的演示中,我们必须将所有打印机驱动程序文件从c:\\ UTReportPrerequisite \\ Driver复制到返回的文件夹GetPrinterDriverDirectory

    //Install Driver
    
    void CInstallPrinterDlg::OnBnClickedButtonStep3()
    {
        CString msg="Failed";
        if (CopyPrintDriverFiles2System() && AddPrinterDriver())
            msg = "Add Printer Driver Successfully";
        
        AfxMessageBox(msg);
    
        return ;
    }

    另一个棘手的事情是pDependentFiles领域DRIVER_INFO_3从MSDN:pDependentFiles指向一个以空字符结尾的字符串的指针,该字符串指定驱动程序所依赖的文件。字符串中的每个文件名也被终止为空(例如,“ Pscript.dll \ 0Qms810.PPD \ 0Pscrptui.dll \ 0Pspcriptui.h​​lp \ 0Pstest.txt \ 0 \ 0 ”)。我们如何为此字段分配一个值?我的答案是:

    DRIVER_INFO_3 di3; 
    ...
    di3.pDependentFiles = TEXT("hpbafd32.dll\0hpbftm32.dll\0HPLJ8550.cfg\" 
                               "0hpcdmc32.dll\0hpbcfgre.dll\0hpdcmon.dll\0\0");
  2. 更新注册表

    为了让我们的PDF 编写器工作像一个魅力,我们必须更新Ghostscript和RedMon的注册表信息对于RedMon

    //#define PORT_KEY TEXT("SYSTEM\\ControlSet001\\Control\\"
    //                      "Print\\Monitors\\Redirected Port\\Ports\\UTReportPDFPort:")
    
    if ((rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, PORT_KEY, 0, 
                           KEY_ALL_ACCESS, &hkey)) != ERROR_SUCCESS) 
    {
        /* failed to open key, so try to create it */
        rc = RegCreateKey(HKEY_LOCAL_MACHINE, PORT_KEY, &hkey);
    }
    if (rc == ERROR_SUCCESS) 
    {
        lstrcpy(buffer, "@c:\\UTReportPrerequisite\\gs\\pdfwrite.rsp -");
        RegSetValueEx(hkey, TEXT("Arguments"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        lstrcpy(buffer, "C:\\UTReportPrerequisite\\gs\\gs8.53\\bin\\gswin32c.exe");
        RegSetValueEx(hkey, TEXT("Command"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        dwValue =2;
        RegSetValueEx(hkey, TEXT("ShowWindow"), 0, 
                                 REG_DWORD,(CONST BYTE *)&dwValue, 4);
    
        dwValue =0;
        RegSetValueEx(hkey, TEXT("RunUser"), 0, REG_DWORD,
                                (CONST BYTE *)&dwValue, 4);
    
        dwValue =300;
        RegSetValueEx(hkey, TEXT("Delay"), 0, REG_DWORD,
                     (CONST BYTE *)&dwValue, 4);
    
        RegCloseKey(hkey);
    }

    对于Ghostscript:

    //#define GHOSTSCRIPT_KEY2 TEXT("SOFTWARE\\AFPL Ghostscript\\8.53")
    
    if ((rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, GHOSTSCRIPT_KEY2, 0, 
                           KEY_ALL_ACCESS, &hkey)) != ERROR_SUCCESS) 
    {
        /* failed to open key, so try to create it */
        rc = RegCreateKey(HKEY_LOCAL_MACHINE, GHOSTSCRIPT_KEY2, &hkey);
    }
    
    if (rc == ERROR_SUCCESS) 
    {
        lstrcpy(buffer, TEXT("C:\\UTReportPrerequisite\\gs\\gs8.53\\bin\\gsdll32.dll"));
        RegSetValueEx(hkey, TEXT("GS_DLL"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        lstrcpy(buffer, TEXT("C:\\UTReportPrerequisite\\gs\\gs8.53\\lib;C:\\" 
                             "UTReportPrerequisite\\gs\\fonts;C:\\UTReportPrerequisite" 
                             "\\gs\\gs8.53\\Resource"));
        RegSetValueEx(hkey, TEXT("GS_LIB"), 0, REG_SZ, 
                     (CONST BYTE *)buffer, lstrlen(buffer)+1);
    
        RegCloseKey(hkey);
    }
  3. 关于pdfwrite.rsp

    pdfwrite.rsp实际上是用于控制PDF生成的参数文件,即页面大小,分辨率等-sOutputFile,用于控制生成的PDF文件应该在哪里。有关详细信息,请阅读Ghostscript在线帮助。

    -Ic:\UTReportPrerequisite\gs\gs8.53\lib;c:\UTReportPrerequisite\gs\fonts
     -sDEVICE=pdfwrite
     -r600
     -dNOPAUSE
     -dSAFER
     -sPAPERSIZE=letter
     -sOutputFile="c:\SampleOut.PDF"

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值