我有一个非常不寻常的应用程序,并不是我所需要的,我希望这里有人会提出一些build议,或者至less有一个方向来进行调查。
我们有一个博物馆展览,在入口处有一台电脑,驾驶两台小票据打印机。 控制台上有两个button,连接到去皮鼠标的左右button。 两个打印机和相关的button是女孩和男孩,每个button从名称数据库中随机select,并在适当的打印机上打印一张小图,带有graphics图像,关于展品和随机select的名称的几句话。
从概念上讲,一切都很好,但经常挂起。 我在最后一刻得到了这个项目,因为原来的devise师陷入了困境,无法交付,所以展览的作者在开幕前一天问我,是否可以写一些可行的东西。
我是用Word做的,因为我是一个有经验的VBA程序员。 我首先尝试的其他几个途径都导致了死路一条 – 一个不能做graphics,另一个不能处理两台打印机,另一个不能改变字体等等。 问题是它不够快 – Word一次只能驱动一台打印机,而改变活动打印机需要很长时间。 不是按照办公室的标准,在打印机开始工作之前的一两秒延迟就不是问题,但是在这里我需要或多或less的即时响应。 如果孩子们按下一个button,什么也没有发生,他们一遍又一遍地按下,直到发生什么事情,导致在打印机开始反应之前可能会发送六打命令。 有时候它会把程序完全阻塞,因为男孩和女孩会同时按下两个button,Wordlocking,即使没有卡纸,打印机也会吐出一堆票,弄得一团糟。 孩子们开始吵吵闹闹,把哪张票从打印机里拽出来,咆哮着纸带,干扰打印机,一般搞乱了整个事情,往往迫使展示者不得不重新启动计算机,把打印机拿出来
如何确保Windows升级后为打印驱动程序生成正确的.BUD文件
通过Get-WmiObject设置默认打印机时出错:调用SetDefaultPrinter的exception:不支持
打印到本地共享打印机networkingclosures时
在XP / Vista / Win7同时连接
如何通过CMD打印?
我需要的是某种快速编程语言,可以同时驱动两台打印机,而不是MSOffice不得不切换活动的打印机,可以对左右鼠标button单击事件作出反应,可以打印一个小的graphics图像,并可以打印不同的字体大小和样式和。 我不需要太多的东西,但它并不是一个字体。
任何人都可以build议我可以使用这个? 我甚至不知道在Windows下是否可能,“单个活动打印机”垃圾是Office制品还是Windows限制。 二十五年前,我的小型Commodore-64装有两台打印机,两台打印机同时运行,没有任何困难 – 在我看来,今天应该不是这样一个不可能的要求。
收到打印作业Python
Java Print Service:PrintServiceLookup.lookupprintServices不返回联网的打印机
在.NET中编写虚拟打印机
静静地使用Microsoft XPS Document Writer打印机来创buildXPS
从Windows服务打印,无对话,无用户交互
作为一名Python程序员,我会使用类似MSWinPrint.py的东西,并使用Python直接渲染文档。 它看起来像支持文本和图像,并且您可以通过名称轻松地选择系统中的任何打印机。
您需要:
安装Python 。
安装Python for Windows扩展 。
安装PIL 。
安装MSWinPrint 。
然后,你需要编写一个程序来进行打印。 像下面这样。
#python import sys import Image,ImageWin import MSWinPrint # workaround for PIL namespace change MSWinPrint.ImageWin = ImageWin def print_name(name,printer_name): doc = MSWinPrint.document(printer_name) doc.begin_document('naMetag for %s' % name) # print the name at position 20,20 text_pos = 20,20 doc.text(text_pos,name) # add an image for this person img_pos = 40,40 img_size = 100,100 doc.image(img_pos,get_image(),img_size) doc.end_document() def get_image(): image_filename = 'my image.jpg' return Image.open(image_filename) if __name__ == '__main__': name,printer_name = sys.argv[1:] print_name(name,printer_name)
如果将其另存为print_tag.py ,则可以使用两个命令行参数,要打印的名称和图像文件名执行它。
print_tag.py Sally "EPSON Artisan 810"
我运行这个代码,它运作得很好。 我不知道创建自定义打印作业可能是如此简单。
你当然可以在任意数量的打印机上随意运行程序。 当打印作业运行的时候,你可以做更多的事情来自定义。 您可以自定义代码以便始终运行并解释鼠标点击(因为您可能需要wxPython),或者您可能有另一个程序只执行脚本。
正如其他人所说,编程语言不会有太大的变化。 然而(这是一个很大的问题),内置到大多数脚本语言(如VBA和.NET)中的打印库或者只支持打印到系统默认打印机(最常见,而且不能同时打开两个实例,因为系统默认打印机是一个全局设置),或者要求你配置一个全局变量来指定活动打印机(这只影响一个进程,所以可以使用两个实例来解决)。
相反,你将不得不直接调用Windows API。 它绝对允许直接打印到系统上的任何打印机。 以下是如何使用默认打印机的示例。 请注意,只有一行代码(调用GetDefaultPrinter函数)将其GetDefaultPrinter到默认打印机。 向CreateDC提供一个不同的打印机名称可以获得另一台打印机。
如果您调用EnumPrinters函数,则可以查找任何或所有打印机名称,而不仅仅是默认值。 或让管理员预配置打印机名称以在注册表设置或文本文件中使用。
无论如何,您可以同时打开所有打印机的设备上下文。 当然,一旦拥有打印机设备上下文,就必须创建一个打印作业,发送内容并结束打印作业。 MSDN上提供了大量的信息 。
所有的例子都在C语言中,这使C ++成为非默认打印机的明显语言,但只要您知道如何从您的语言中调用WinAPI函数,就可以使用它。 在VBA中,这需要Declare Function XYZ Lib "gdi32" (params here)
http://www.microplex-usa.com/
http://www.microplex.co.uk/
这些家伙打印机有自己的打印控制器,作为打印管理器。
这不是编程语言的问题,它只是您使用的打印机堆栈的限制。
我不知道如果.NET将支持它(或Windows),将支持发送线程上的打印。 您可以将每台打印机放在自己的线程中,并阻止UI接受更多的打印请求。
您也可以尝试打开两台打印机的打印假脱机。 这将在本地渲染,然后返回然后打印。
皮特,你是否考虑过一种完全不同的打印机? 设置,更改和sendint PostSCript命令可能需要很多时间。
一个奇怪的解决方案,你可能会这样称呼,但我们的即时黑白激光DYMO打印机打印出来,按下按钮。 他们的软件可以定制。
它的快速:当放开一个返回键时,就在我的手指已经达到一厘米时,我已经是三年级了,在5厘米左右(释放返回键1秒后),整个标签就出来了。 alberit在黑色和白色。 它的一个标签。
成本:100美元 /包含软件来设计和定制与数据库的连接
我碰巧知道爱普生正在制造彩色激光,即时打印机。
成本:增加几个零,因为他们不仅更昂贵,他们通常只是大批量交付连锁店,食堂,医院,超市等。
Perhaps this solves the speed problem if you do want to keep your Experienced VBA Skills,and change the part that is actually causing the delay. You can ALSO print from Word into this fast printers.
最大尺寸是:60毫米x 200毫米orso。
我知道那些即时打印机使用更少的窗口驱动程序和更多的嵌入式技术,减轻了系统的打印工作,而且由于它们非常简单,所以速度也更快。
也许这会给你带来一个新的想法。
我几年前写了一些东西(在VB6中,所以可能很容易移植到VBA)绕过打印机驱动程序(打印机必须设置,但实际使用的驱动程序是不相关的),并发送原始命令到打印机。 取决于你使用的是哪种打印机,这可能是也可能不是问题(有些使用复杂的转义序列)。 如果你想打印图形,这可能会增加另一层复杂性 – 尽管如果你知道打印机支持什么命令可以完成。 我设法在点阵打印机上打印位图,但这不是一个5分钟的任务。 如果这是你感兴趣的东西,我可以尝试挖掘代码?
守则如下:
Public Type DOCINFO pDocName As String pOutputFile As String pDatatype As String End Type Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long Declare Function EndDocPrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long Declare Function EndPagePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrintera" (ByVal pprinterName As String,PHPrinter As Long,ByVal pDefault As Long) As Long Declare Function StartDocPrinter Lib "winspool.drv" Alias "StartDocPrintera" (ByVal hPrinter As Long,ByVal Level As Long,pDocInfo As DOCINFO) As Long Declare Function StartPagePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long Declare Function WritePrinter Lib "winspool.drv" (ByVal hPrinter As Long,pBuf As Any,ByVal cdBuf As Long,pcWritten As Long) As Long Public Function PrintRawData(ByVal sPrinter As String,ByVal sDocName As String,ByVal sData As String) As Boolean On Error GoTo PrintErr: Dim lhPrinter As Long,lReturn As Long,lpcWritten As Long Dim lDoc As Long,sWrittenData As String Dim MyDocInfo As DOCINFO Dim pOutput As Printer Dim p As Printer For Each p In Printers If p.DeviceName = sPrinter Then Set pOutput = p GoTo StartPrinting End If Next p MsgBox "Unable to find the specified printer [" & sPrinter & _ "] in the list of currently installed printers" & vbCrLf & _ "Printing will be aborted",vbCritical Exit Function StartPrinting: lReturn = OpenPrinter(pOutput.DeviceName,lhPrinter,0) If lReturn = 0 Then MsgBox "Print was unsuccessful. Make sure there is a printer installed on the port you are trying to print to" Exit Function End If MyDocInfo.pDocName = sDocName MyDocInfo.pOutputFile = vbNullString MyDocInfo.pDatatype = vbNullString lDoc = StartDocPrinter(lhPrinter,1,MyDocInfo) Call StartPagePrinter(lhPrinter) sWrittenData = sData lReturn = WritePrinter(lhPrinter,ByVal sWrittenData,Len(sWrittenData),lpcWritten) lReturn = EndPagePrinter(lhPrinter) 'need this?? lReturn = EndDocPrinter(lhPrinter) lReturn = ClosePrinter(lhPrinter) Exit Function PrintErr: MsgBox "Print was unsuccessful. Make sure there is a printer installed on the port you are trying to print to" Exit Function End Function
要使用它,您需要使用任何驱动程序安装使用正确端口的打印机(通常使用通用/纯文本驱动程序),然后按以下方式调用它,将Hello用您要发送到打印机的数据替换,包括控制字符等等:
PrintRawData "Generic / Text Only","My Document","Hello"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。