【问题标题】:Linux/CUPS printing example/tutorial? [closed]Linux/CUPS 打印示例/教程? [关闭]
【发布时间】:2013-01-09 04:37:08
【问题描述】:

我需要使用 Linux 打印一些矢量数据(或者更准确地说:一些点和折线)。当我向 Google 询问时,它向我展示了许多教程和文档 - 但都是针对最终用户的,没有编程示例。

那么有谁知道在 Linux 下显示打印的优秀程序员 HOWTO/教程?

谢谢!

【问题讨论】:

    标签: c++ c linux printing cups


    【解决方案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;
    }
    

    严格来说,您不需要该临时文件:CUPS API 允许您构建一个流,并且您可以将页面数据发送到其中(但一个文件便于调试)。

    【讨论】:

    • 我一直在尝试使用适当的 DPI 将表面数据直接打印到杯子而不是临时文件。你能建议哪个api吗?谢谢
    • Dinesh Kumar Govinda:这需要使用 CUPS API 来查找打印机,在其上打开作业,然后将数据流式传输到相应的作业中。这与这个问题完全不同。我建议您创建一个新问题(标记为 [cups] 和 [c])来提问,因为您会比在那里提问更能吸引注意力。如果我记得如何(已经有几年了)我会在那里回答,但也许有 CUPS 经验丰富的人可以帮助你。
    猜你喜欢
    • 2015-04-10
    • 2011-01-18
    • 2013-03-08
    • 2011-06-26
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2018-03-16
    • 2011-04-18
    相关资源
    最近更新 更多