当前位置: 技术问答>linux和unix
linux C 如何实现打印功能
来源: 互联网 发布时间:2016-02-18
本文导语: 在c程序中,需要把一些信息通过打印机输出,如何实现,哪位好人有类次的源码?? | Linux中的打印程序有两种,一种是系统打印,也就是lp命令(一般系统配置好打印机以后,这个命令就可以直接使用),...
在c程序中,需要把一些信息通过打印机输出,如何实现,哪位好人有类次的源码??
|
Linux中的打印程序有两种,一种是系统打印,也就是lp命令(一般系统配置好打印机以后,这个命令就可以直接使用),要求打印机直接接在装有Linux系统的机器上,另一种是终端打印,就要要求打印机是接在终端的串口上.
那么lp是系统自带的,我们可以简单地使用system("lp filename");就可以实现打印机打印文件了
另外一种需要我们自己再写一个程序,这个程序可以是sh,也可以是C语言:
sh程序:比如locp.sh
if [ $# = 0 ]
then
exit -1 /*如果参数为0个,直接退出*/
else
echo "33[5i" /*打开这个端口,很什么打印机无关,一般打印机端口都是这个*/
cat $* /*显示文件名,其实就是在这个端口显示这个文件,打印机就会自动打印了*/
echo "33[4i" /*关闭端口*/
exit 0 /*正常退出*/
fi
C程序:比如locp.c (时间仓促,格式未整理,注释未加,未测试)
编译使用: cc -o locp locp.c
#include
#include
#include
int main ( int argc ,char * argv [])
{
FILE *rpt_ptr;
FILE *print_ptr;
char buf[10240];
char v_begin[]= "^[[5i";
char v_end[] = "^[[4i";
int num =0;
if ( argc != 2 )
{
printf("Usage : locp filename n");
return -1;
}
print_ptr = fopen ( "/dev/tty","wt");
if ( print_ptr == NULL )
{
printf("打开终端失败.n");
exit -1;
}
rpt_ptr = fopen ( argv[1],"rt");
if ( rpt_ptr == NULL )
{
printf("文件 %s 不存在或没有读权限 n",argv[1]);
fclose(print_ptr);
exit -1;
}
fputs ( v_begin,print_ptr);
while (fgets(buf,10240,rpt_ptr) != NULL)
{
/*
if ( num > 20 )
{
fputs ( v_end,print_ptr);
fflush(print_ptr);
sleep(10);
fputs ( v_begin,print_ptr);
num =0;
}
num ++;
*/
num = strlen ( buf );
/*
if ( buf[num - 1] == '^M' )
{
buf[num-1] = '';
}
*/
fputs ( buf,print_ptr);
fflush(print_ptr);
}
// fputs ( "^L",print_ptr);
fputs ( v_end,print_ptr);
fflush(print_ptr);
fclose(rpt_ptr);
fclose(print_ptr);
return 0;
}
c程序中使用system("locp filename");即可
那么lp是系统自带的,我们可以简单地使用system("lp filename");就可以实现打印机打印文件了
另外一种需要我们自己再写一个程序,这个程序可以是sh,也可以是C语言:
sh程序:比如locp.sh
if [ $# = 0 ]
then
exit -1 /*如果参数为0个,直接退出*/
else
echo "33[5i" /*打开这个端口,很什么打印机无关,一般打印机端口都是这个*/
cat $* /*显示文件名,其实就是在这个端口显示这个文件,打印机就会自动打印了*/
echo "33[4i" /*关闭端口*/
exit 0 /*正常退出*/
fi
C程序:比如locp.c (时间仓促,格式未整理,注释未加,未测试)
编译使用: cc -o locp locp.c
#include
#include
#include
int main ( int argc ,char * argv [])
{
FILE *rpt_ptr;
FILE *print_ptr;
char buf[10240];
char v_begin[]= "^[[5i";
char v_end[] = "^[[4i";
int num =0;
if ( argc != 2 )
{
printf("Usage : locp filename n");
return -1;
}
print_ptr = fopen ( "/dev/tty","wt");
if ( print_ptr == NULL )
{
printf("打开终端失败.n");
exit -1;
}
rpt_ptr = fopen ( argv[1],"rt");
if ( rpt_ptr == NULL )
{
printf("文件 %s 不存在或没有读权限 n",argv[1]);
fclose(print_ptr);
exit -1;
}
fputs ( v_begin,print_ptr);
while (fgets(buf,10240,rpt_ptr) != NULL)
{
/*
if ( num > 20 )
{
fputs ( v_end,print_ptr);
fflush(print_ptr);
sleep(10);
fputs ( v_begin,print_ptr);
num =0;
}
num ++;
*/
num = strlen ( buf );
/*
if ( buf[num - 1] == '^M' )
{
buf[num-1] = '';
}
*/
fputs ( buf,print_ptr);
fflush(print_ptr);
}
// fputs ( "^L",print_ptr);
fputs ( v_end,print_ptr);
fflush(print_ptr);
fclose(rpt_ptr);
fclose(print_ptr);
return 0;
}
c程序中使用system("locp filename");即可
|
在unix体统当中,打印机会被当作文件,如果是普通的文本文件的打印,读取文件内容,然后输出到文件/dev/lp0(lp1...2)中去就可以了。
如果是PDF,Word等等这类特殊格式的文件,在输出到打印机之前应该由打印驱动程序将内容转化为所见即所得的二进制流,再输出到打印机中。
相关的打印驱动恐怕要你从网上寻找,像很多windows的文件,很少有linux的打印驱动模块的,恐怕你要自己研究文件格式然后开发。
如果不愿意传输到windows打印服务器 而 非要在linux下打印的话,建议相关的打印模块用java开发,或许能从网上找到相关的源代码。
如果是PDF,Word等等这类特殊格式的文件,在输出到打印机之前应该由打印驱动程序将内容转化为所见即所得的二进制流,再输出到打印机中。
相关的打印驱动恐怕要你从网上寻找,像很多windows的文件,很少有linux的打印驱动模块的,恐怕你要自己研究文件格式然后开发。
如果不愿意传输到windows打印服务器 而 非要在linux下打印的话,建议相关的打印模块用java开发,或许能从网上找到相关的源代码。