Linux/CUPS пример/учебник по печати?

Мне нужно напечатать некоторые векторные данные (или, если быть более точным: некоторые точки и полилинии) с помощью Linux. Когда я спрашиваю Google об этом, он показывает мне множество руководств и документации, но все для конечных пользователей, без примеров программирования.

Итак, кто-нибудь знает хороший HOWTO/учебник для программистов, который показывает печать под Linux?

Спасибо!


person Elmi    schedule 25.01.2013    source источник


Ответы (1)


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

Строго вам не нужен этот временный файл: API CUPS позволяет вам создать поток, и вы можете передать в него данные страницы (но файл удобен для отладки).

person Finlay McWalter    schedule 01.02.2013