2013-01-25 16 views
9

Ho bisogno di stampare alcuni dati vettoriali (o per essere più precisi: alcuni punti e polilinee) usando Linux. Quando chiedo a Google per questo mi mostra molti tutorial e documentazioni - ma tutto per gli utenti finali, nessun esempio di programmazione.Esempio di esercitazione/tutorial per Linux/CUPS?

Così qualcuno conosce un buon programma HOWTO/tutorial che mostra la stampa sotto Linux?

Grazie!

risposta

13

CUPS non ha una propria API descrizione documento. Non ne ha bisogno: formati come PostScript, PDF e JPEG sono cittadini di prima classe di CUPS. Si utilizza qualsiasi programma o API che si desidera creare un tale file, quindi lo si invia a CUPS (con lpr o con l'API CUPS) e CUPS lo trasformerà nel formato interno appropriato e lo invierà alla stampante.

Quindi, per il tuo caso, potresti utilizzare una libreria di grafica vettoriale come Cairo per creare PostScript, quindi inviarlo a CUPS per la stampa. Ecco un semplice esempio C:

// compile with: 
// gcc -Wall -o cairo_print cairo_print.c `pkg-config --cflags --libs cairo` `cups-config --cflags --libs` 

#include <stdio.h> 
#include <cairo.h> 
#include <cairo-ps.h> 
#include <cups/cups.h> 

// A4 width, height in points, from GhostView manual: 
// http://www.gnu.org/software/gv/manual/html_node/Paper-Keywords-and-paper-size-in-points.html 
#define WIDTH 595 
#define HEIGHT 842 

int main(int argc, char** argv) { 
    if (argc!= 2){ 
    fprintf (stderr, "usage: %s word\n", argv[0]); 
    return 1; 
    } 

    // setup 
    char* tmpfilename = tempnam(NULL,NULL); 
    cairo_surface_t* surface = cairo_ps_surface_create(tmpfilename, 
                WIDTH, 
                HEIGHT); 
    cairo_t *context = cairo_create(surface); 

    // draw some text 
    cairo_select_font_face(context, 
         "Arial Black", 
         CAIRO_FONT_SLANT_NORMAL, 
         CAIRO_FONT_WEIGHT_NORMAL); 
    cairo_set_font_size(context, 30); 
    cairo_move_to(context, WIDTH/2, HEIGHT/2); 
    cairo_show_text(context, argv[1]); // the text we got as a parameter 

    // draw a dotted box 
    const double pattern[] = {15.0, 10.0}; 
    cairo_set_dash(context, pattern, 2, 0); 
    cairo_set_line_width(context, 5); 
    cairo_rectangle(context, WIDTH*0.33, HEIGHT*0.33, WIDTH*0.5, WIDTH*0.5); 
    cairo_stroke(context); 

    // finish up 
    cairo_show_page(context); 
    cairo_destroy(context); 
    cairo_surface_flush(surface); 
    cairo_surface_destroy(surface); 

    // print 
    cupsPrintFile(cupsGetDefault(), tmpfilename, "cairo PS", 0, NULL); 
    unlink(tmpfilename); 

    return 0; 
} 

Rigorosamente non occorre che il file temporaneo: il CUPS API permette di costruire un ruscello e si possono emettere i dati della pagina in cui (ma un file è utile per il debugging) .