首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux/CUPS打印示例/教程?

Linux/CUPS打印示例/教程?
EN

Stack Overflow用户
提问于 2013-01-25 16:26:16
回答 1查看 10.4K关注 0票数 11

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

那么,有没有人知道一个好的程序员如何在Linux下打印的教程?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-02 05:26:15

CUPS没有自己的文档描述API。它不需要:像PostScript,PDF和JPEG这样的格式是CUPS的一等公民。您可以使用任何您喜欢的程序或API来创建这样的文件,然后将其发送到CUPS (使用lpr或CUPS API),CUPS会将其转换为适当的内部格式并将其发送到打印机。

因此,对于您的情况,您可以使用像Cairo这样的矢量图形库来创作PostScript,然后将其发送到CUPS进行打印。下面是一个简单的C示例:

代码语言:javascript
运行
复制
// 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允许构造一个流,并且可以将页面数据发送到其中(但是文件对于调试很方便)。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14518004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档