2013-01-25 23 views
9

Linuxを使用してベクターデータを印刷する必要があります(正確にはいくつかのドットとポリライン)。 Googleには、多くのチュートリアルやドキュメントが表示されますが、すべてのエンドユーザー向けにプログラミング例はありません。Linux/CUPSの印刷例/チュートリアル?

誰でも、Linuxでの印刷を示す良いプログラマーのHOWTO /チュートリアルを知っていますか?

ありがとうございます!

答えて

13

CUPSには独自のドキュメント記述APIがありません。 PostScript、PDF、JPEGなどのフォーマットは、CUPSの一流の市民です。そのようなファイルを作成するプログラムやAPIを使用し、CUPS(lprまたはCUPS APIの場合)に送信すると、CUPSはこれを適切な内部形式に変換してプリンタに送信します。

あなたのケースでは、Cairoのようなベクターグラフィックスライブラリを使用してPostScriptを作成し、それを印刷用にCUPSに送信することができます。ここでは簡単な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; 
} 

厳密にあなたは一時ファイルという必要はありません:CUPS APIを使用すると、ストリームを構築することを可能にし、そのにページデータを発することができる(ただし、ファイルがデバッグ用に便利です) 。