2012-07-18 13 views
5

Ho una sequenza di sequenze di escape della stampante (ESC/P) che devo inviare a una stampante (USB o di rete) su Mac OS X. Come posso farlo? Sta usando CUPS direttamente nel modo migliore? Esiste un modo "di livello superiore"?Come inviare sequenze di escape di basso livello a una stampante su OS X?

E prima di chiedere: ho davvero bisogno di inviare sequenze di escape e non posso semplicemente usare il sistema di stampa di alto livello.

Edit: Questi sono alcuni progetti e risorse che forniscono funzionalità simili in altre lingue come Java:

+0

Come sai che hai bisogno di una sequenza di escape? Stai lavorando a un bug nel driver Epson? – NoBugs

+0

Più o meno. È un requisito del cliente e sfortunatamente non posso approfondire altri dettagli. –

risposta

3

Immagino che il il modo migliore per farlo sarebbe quello di usare solo CUPS/lp:

echo "ctrl_char" | cat file_to_print - | lp [...flags...] 
+0

Grazie, ma sfortunatamente non è così semplice: non è necessario stampare semplicemente i file. Le sequenze di escape che vogliamo inviare alla stampante includono tutti i dati (immagine) che devono essere stampati. –

+0

Inoltre, mi piacerebbe utilizzare un'API Cocoa/Foundation/C senza chiamare un comando CLI esterno. Se possibile :) –

3

È possibile inviare i caratteri di controllo in C utilizzando il sistema unix chiamate:

char escp_seq[BYTES_FOR_SEQUENCE]; 

// ...initialize the ESC/P sequence. 

int printer_fd = open("/dev/lp0", O_WRONLY); 
ssize_t bytes_written = write(printer_fd, escp_seq, sizeof(escp_seq)); 
close(printer_fd); 

Per quanto riguarda i dati da stampare in sé, è possibile utilizzare .

Usando questa libreria, è possibile utilizzare una o

OSStatus PMPrinterPrintWithProvider (
    PMPrinter printer, 
    PMPrintSettings settings, 
    PMPageFormat format, 
    CFStringRef mimeType, 
    CGDataProviderRef provider 
); 

che richiederebbe di costruire una CGDataProviderRef con i tuoi dati.

In alternativa, è possibile utilizzare un file:

OSStatus PMPrinterPrintWithFile (
    PMPrinter printer, 
    PMPrintSettings settings, 
    PMPageFormat format, 
    CFStringRef mimeType, 
    CFURLRef fileURL 
); 

Mi scuso per non essere in grado di dare un esempio di codice concreto, ma io davvero non so come si intende costruire i dati che si desidera inviare alla stampante. Questo dovrebbe almeno fornire una base per iniziare a fare hacker. Sono sicuro che ci sono più che abbastanza cose nei documenti Apple sopra forniti per portare a termine il tuo compito.

Buona fortuna!

+0

Grazie mille per il tuo aiuto e il tuo lavoro, Michael! Potrebbe non essere ancora al 100% quello che sto cercando, ma è un inizio, grazie! –

1

Stiamo stampando da bash shell Mac utilizzando lo scripting (in tester di prodotti End Of Line automatizzato e professionale).

molto semplificate "Hello" stampata un'etichetta come questo:

data="\x1Bia\x00" 
data="${data}\[email protected]" 
data="${data}\x1BX\x32" 
data="${data}Hello" 
data="${data}\x0C" 

# Check your own binary for debugging: 
echo -ne $data | hexdump -C 

# print the actual label 
echo -ne $data | lp -d Brother_PT_P900W 

Nota, che è necessario sostituire il nome della stampante con il proprio nome della stampante.

+0

Questo è molto utile! Hai un link al riferimento per i diversi comandi che puoi inviare? –

+0

Non sai cosa intendi con 'comandi': a) comando shell bash; o b) Comandi ESC/P? Se intendi b), ho scaricato i documenti PDF dal produttore della stampante, nel mio caso Brother PT-P900W – EmbeddedGuy