2013-01-25 13 views
9

Potrzebuję wydrukować niektóre dane wektorowe (lub dokładniej: niektóre kropki i polilinie) używając Linuksa. Kiedy pytam Google o to, pokazuje mi wiele samouczków i dokumentacji - ale wszystko dla użytkowników końcowych, bez przykładów programowania.Przykład drukowania/samouczka Linux/CUPS?

Więc czy ktoś zna dobrego programistę HOWTO/tutorial, który pokazuje drukowanie pod Linuksem?

Dzięki!

Odpowiedz

13

CUPS nie ma własnego API opisu dokumentu. Nie jest to potrzebne: formaty takie jak PostScript, PDF i JPEG są pierwszorzędnymi obywatelami CUPS. Korzystasz z dowolnego programu lub API, aby utworzyć taki plik, a następnie wysyłasz go do CUPS (z lpr lub z CUPS API), a CUPS przekształci go w odpowiedni format wewnętrzny i wyśle ​​go do drukarki.

W twoim przypadku możesz użyć biblioteki grafiki wektorowej, takiej jak Cairo do napisania PostScript, a następnie wysłać ją do CUPS w celu drukowania. Oto prosty C Przykład:

// 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; 
} 

Ściśle nie trzeba ten plik tymczasowy: kubki API pozwala na skonstruowanie strumienia i można emitować dane stron w to (ale plik jest przydatna do debugowania) .