Windows 服务可以打印 PDF 文件吗?

Windows 服务可以打印 PDF 文件吗?

我在已使用 NSSM 安装为 Windows 服务的 Python 脚本中拥有此功能。当 Python 脚本正常运行(即不作为服务)时,会打印该文件。但是,当它作为服务安装时,它不会打印。

打印命令由另一台设备通过 opc-ua 外部触发。

当脚本作为服务安装时,是否可以打印?当作为服务安装时,我也没有收到任何异常。有时我KeyboardInterrupt在循环之间休眠时会收到异常。

还有其他方法可以通过 opc-ua 打印外部触发的文件吗?

我知道我可以在 Windows 任务调度程序中创建 20 个不同的触发器,这样每 5 秒就会执行一次并检查 opc-ua 变量。这似乎是一个非常繁琐的过程

以下是我的 Python 脚本的一部分:

def CheckOpcuaNode(latestPDF):
    client = Client("opc.tcp://192.168.202.90:4840/")
    try:
        client.connect()
        opcuaNode = client.get_node("ns=6;s=::AsGlobalPV:g_saveParameters.bPrintNow")
        Result = opcuaNode.get_value() 
        if Result == True:
             print("print file: %s" % str(latestPDF))
             os.startfile(latestPDF, "print")
             try:
                time.sleep(4)
             except KeyboardInterrupt:  # Ignore keyborditerruption
                print("ERROR KeyboardInterrupt while printing: %s" % sys.exc_info()[0])
             opcuaNode.set_attribute(ua.AttributeIds.Value, ua.DataValue(False))
    except:
            print("ERROR while checking if PDF shall be printed: %s" % sys.exc_info()[0])
    finally:
        client.disconnect()

def LatestPdf():
    return 'path\to\PDF\file.pdf'

if __name__ == '__main__':
while True:
    latestPdfFile = LatestPdf()
    if latestPdfFile != '':
        CheckOpcuaNode(latestPdfFile) # check If PLC has asked to print pdf file
    try:
        time.sleep(4)
    except KeyboardInterrupt:  # Ignore keyborditerruption
        print("ERROR KeyboardInterrupt between loops: %s" % sys.exc_info()[0])

答案1

Acrobat 打开一个窗口然后继续打印文件是您的问题。

服务通常无法访问图形环境。它们通常“非交互式“。

你可能想找一个命令行PDF打印工具或者直接从 Python 脚本打印。编程问题与此无关,因此我无法解决这个问题的特定方面(它属于堆栈溢出)。

答案2

  1. 在普通用户帐户下运行该服务
  2. 使用该用户帐户登录以打开 Adob​​e Reader 并接受 EULA(每个用户都需要执行此操作)连接网络打印机(“本地系统帐户”无法实现),并将其设为默认打印机

故障排除:在脚本中调用“wmic 打印机列表简介 >> c:\serviceprinters.txt”以查看用户配置文件是否正确加载/网络打印机是否可用

相关内容