Benötigen Sie eine schnelle Programmiersprache, die zwei Drucker ansteuern kann

8

Ich habe eine ziemlich ungewöhnliche Anwendung, die nicht so funktioniert, wie ich es brauche, und ich hoffe, dass jemand hier einige Vorschläge oder zumindest eine Richtung zum Nachforschen hat.

Wir haben eine Museumsausstellung, die einen Computer am Eingang hat, der zwei kleine Belegdrucker antreibt. Auf einer Konsole befinden sich zwei Tasten, die mit den linken und rechten Tasten einer entweihten Maus verbunden sind. Die zwei Drucker und die zugehörigen Knöpfe sind für Mädchen und Jungen, jede Taste wählt eine zufällige Auswahl aus einer Datenbank von Namen aus und druckt ein kleines Ticket auf dem entsprechenden Drucker mit einem grafischen Bild, ein paar Worten über das Exponat und den zufällig gewählten Namen / p>

Vom Konzept her ist alles in Ordnung, aber es hängt ziemlich oft. Ich habe das Projekt in letzter Minute bekommen, weil der ursprüngliche Designer sich festgefahren hat und nicht liefern konnte, so fragte mich der Autor der Ausstellung am Tag vor der Eröffnung, ob ich etwas schreiben könnte, das funktionieren würde.

Ich habe es in Word gemacht, da ich ein erfahrener VBA-Programmierer bin. Mehrere andere Wege, die ich zuerst versuchte, führten alle zu Sackgassen - man konnte keine Grafiken machen, ein anderer konnte nicht mit zwei Druckern umgehen, ein anderer konnte die Schriftarten nicht ändern und so weiter. Das Problem ist, dass es einfach nicht schnell genug ist - Word kann nur jeweils einen Drucker steuern und das Wechseln des aktiven Druckers dauert sehr lange. Nicht nach Büro-Standards, wo ein oder zwei Sekunden Verspätung, bevor ein Drucker an Ihrem Dokument arbeitet, kein Problem ist, aber hier brauche ich mehr oder weniger sofortige Antwort. Wenn Kinder einen Knopf drücken und nichts passiert, drücken sie es immer wieder, bis etwas passiert, was dazu führt, dass vielleicht ein halbes Dutzend Befehle gesendet werden, bevor der Drucker zu reagieren beginnt. Manchmal stört es das Programm komplett, da Jungen und Mädchen die beiden Tasten gleichzeitig drücken und Word stürzt ab, und selbst wenn es nicht klemmt, spuckten die Drucker einen Strom von Tickets aus und machten ein Durcheinander. Die Kinder fangen an, sich über das Ticket zu streiten, das sie aus den Druckern zieht, das Papierband knurrt, den Drucker stört und die ganze Angelegenheit in Unordnung bringt, was oft dazu führt, dass die Ausstellungsbetreuer den Computer neu starten und zerrissene Teile löschen müssen Papier aus den Druckern.

Was ich brauche, ist eine schnelle Programmiersprache, die zwei Drucker * -simultan - * ansteuert, nicht die MSOffice-Version von den aktiven Drucker wechseln zu müssen, der sowohl auf linkes als auch auf rechtes Mausklick-Ereignis reagieren kann, kann ein kleines grafisches Bild drucken und in verschiedenen Schriftgrößen und -stilen drucken. Ich brauche nicht viele, aber es ist nicht alles in einer Schrift.

Kann jemand vorschlagen, was ich dafür verwenden könnte? Ich weiß nicht mal, ob es unter Windows überhaupt möglich ist, ob der "Single Active Printer" -Müll ein Office-Artefakt oder eine Windows-Einschränkung ist. Mein kleiner Commodore-64 hatte vor fünfundzwanzig Jahren zwei Drucker angeschlossen und fuhr beide gleichzeitig ohne Schwierigkeiten - es scheint mir nicht so eine unmögliche Voraussetzung heute sein.

    
Pete 17.12.2010, 22:18
quelle

6 Antworten

3

Als Python-Programmierer würde ich etwas wie MSWinPrint.py verwenden und die Dokumente direkt mit Python rendern. Es sieht so aus, als ob es Text und Bilder unterstützt, und Sie können einfach jeden Drucker im System nach Namen auswählen.

Sie müssten:

  1. Installieren Sie Python .
  2. Installieren Sie Python für Windows-Erweiterungen .
  3. Installieren Sie PIL .
  4. Installieren Sie MSWinPrint .

Dann müssten Sie ein Programm zum Drucken schreiben. Etwas wie das Folgende.

%Vor%

Wenn Sie dies als print_tag.py speichern, können Sie es mit zwei Befehlszeilenargumenten, dem zu druckenden Namen und dem Bilddateinamen ausführen.

%Vor%

Ich habe diesen Code ausgeführt und es hat super funktioniert. Ich wusste nicht, dass das Erstellen eines benutzerdefinierten Druckauftrags so einfach sein könnte.

Sie können das Programm natürlich beliebig oft auf so vielen Druckern ausführen, wie Sie möchten. Es gibt sicherlich mehr, was Sie tun können, um anzupassen, wann ein Druckauftrag ausgeführt wird. Sie könnten den Code anpassen, um die Mausklicks immer auszuführen und zu interpretieren (dafür benötigen Sie wxPython), oder Sie haben möglicherweise ein anderes Programm, das nur das Skript ausführt.

    
Jason R. Coombs 24.12.2010 18:46
quelle
2

Wie andere schon gesagt haben, wird die Programmiersprache keinen großen Unterschied machen. Wie dem auch sei, die Druckbibliotheken, die in den meisten Skriptsprachen wie VBA und .NET integriert sind, unterstützen nur das Drucken auf dem Standarddrucker des Systems (am häufigsten und können nicht bearbeitet werden, wenn zwei Instanzen gleichzeitig geöffnet sind) , da der Systemstandarddrucker eine globale Einstellung ist) oder Sie müssen eine globale Variable konfigurieren, um den aktiven Drucker anzugeben (dies betrifft nur einen Prozess und könnte daher mit zwei Instanzen ausgeführt werden).

Stattdessen müssen Sie die Windows-API direkt aufrufen. Es ermöglicht auf jeden Fall den direkten Druck auf jeden Drucker im System. Hier ein Beispiel für die Verwendung des Standarddruckers. Beachten Sie, dass nur eine Codezeile ( Aufruf der GetDefaultPrinter -Funktion) bindet dies an den Standarddrucker. Durch die Angabe eines anderen Druckernamens für CreateDC erhalten Sie einen anderen Drucker.

Wenn Sie stattdessen die Funktion EnumPrinters aufrufen, können Sie ALLE oder ALLE herausfinden der Druckernamen, nicht nur die Standardeinstellung. Oder lassen Sie den Drucker die Druckernamen vorkonfigurieren, die in einer Registrierungseinstellung oder Textdatei verwendet werden sollen.

In jedem Fall können Sie Gerätekontexte für alle Drucker gleichzeitig öffnen. Sobald Sie den Druckergerätekontext haben, müssen Sie natürlich einen Druckauftrag erstellen, Ihren Inhalt senden und den Druckauftrag beenden. Es gibt viele Informationen auf MSDN .

Alle Beispiele sind in C, was C ++ zur offensichtlichen Sprache für das Drucken auf Nicht-Standarddruckern macht, aber solange Sie wissen, wie Sie WinAPI-Funktionen von Ihrer Sprache aus aufrufen, können Sie sie stattdessen verwenden. In VBA würde das Declare Function XYZ Lib "gdi32" (params here)

erfordern     
Ben Voigt 24.12.2010 02:19
quelle
1

Ссылка

Ссылка

Diese Jungs haben einen eigenen Druckcontroller, der als Druckmanager fungiert.

    
Roach Devaraj 16.06.2011 07:32
quelle
0

Dies ist kein Problem mit der Programmiersprache, es ist nur eine Einschränkung des Druckerstapels, den Sie verwenden.

Ich bin mir nicht sicher, ob .NET es unterstützen würde (oder Windows für diese Angelegenheit) würde das Senden von Druck auf einen Thread unterstützen. Sie können jedem Drucker einen eigenen Thread zuweisen und verhindern, dass die Benutzeroberfläche mehr Druckanforderungen akzeptiert.

Sie können auch versuchen, das Drucken für beide Drucker zu aktivieren. Das wird es lokal rendern und dann print zurückgeben.

    
Daniel A. White 17.12.2010 22:22
quelle
0

Pete, haben Sie eine ganz andere Art von Drucker in Betracht gezogen? Das Setzen, Ändern und Senken von PostScript-Befehlen kann in der Tat viel Zeit in Anspruch nehmen.

Eine seltsame Lösung, wie Sie es vielleicht nennen, aber unser Instant-S / W-Laser-DYMO-Drucker druckt SOFORT auf Knopfdruck. Ihre Software kann angepasst werden.

Es ist bissig: wenn ich einen Rücksprungknopf loslasse, gerade wenn mein Finger einen Zentimeter erreicht hat, bin ich bereits Jahr IIIIEEEUUUUUU und etwa 5 cm höher (1 Sekunden nach Freigabe des Rückkehrtasters) ist das gesamte Etikett aus. Alberit in Schwarz und Weiß. Es ist ein Aufkleber.

COST: 100 $ pro Einheit inkl. Software zum Gestalten und Anpassen von Verbindungen mit der Datenbank

Ich weiß zufällig, dass EPSON COLOR Laser, Sofortdrucker herstellt.
KOSTEN: Fügen Sie mehrere Nullen hinzu, da sie nicht nur teurer sind, sondern in der Regel nur in großen Serien geliefert werden - Parfümerien, Krankenhäuser, Supermärkte usw.

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.

Maximale Größe ist: 60 mm x 200 mm orso.

Ich weiß, dass diese Instant-Drucker viel weniger Windows-Bases-Treiber und mehr eingebettete Technologien verwenden, die das System vom Druckjob entlasten, und da sie viel einfacher sind, sind sie auch viel schneller.

Vielleicht bringt Sie das auf eine neue Idee.

    
Sam 24.12.2010 01:59
quelle
0

Ich habe vor ein paar Jahren etwas geschrieben (in VB6 könnte man so leicht auf VBA portieren), das den Druckertreiber umgangen hat (ein Drucker muss eingerichtet sein, aber der eigentliche Treiber war irrelevant) und rohe Befehle an den Drucker gesendet. Abhängig davon, welche Art von Drucker Sie verwenden, kann dies ein Problem sein oder nicht (einige verwenden komplexe Escape-Sequenzen). Wenn Sie Grafiken drucken möchten, könnte dies eine weitere Komplikationsebene hinzufügen - obwohl dies möglich ist, wenn Sie wissen, welche Befehle der Drucker unterstützt. Es gelang mir, Bitmaps auf einem Nadeldrucker zu drucken, aber es war keine 5-Minuten-Aufgabe. Wenn das etwas ist, das dich interessiert, kann ich versuchen, den Code auszugraben?

Der Code lautet wie folgt:

%Vor%

Um es zu verwenden, müssen Sie einen Drucker installieren, der den richtigen Anschluss mit einem beliebigen Treiber verwendet (ich benutze generell den Generic / text Only Treiber) und ihn dann wie folgt aufrufen, indem er das Hello durch die Daten ersetzt, die Sie an den Drucker senden möchten einschließlich Steuerzeichen usw.:

%Vor%     
Matt Wilko 21.12.2010 16:30
quelle

Tags und Links