使用 shell 脚本作为虚拟打印机

使用 shell 脚本作为虚拟打印机

我有一个 shell 脚本,它采用 PDF 文件作为参数,并使用其他打印机特定选项来打印它。如何将此脚本添加为可从 GUI 中选择的虚拟打印机?

shell 脚本是一个手动双面脚本,它获取 PDF 文件,打印偶数页,使用 zenity 向用户提供提示,要求用户翻转页面,然后打印奇数页。

我当前的工作流程是:

  1. 文件 -> 打印 -> 保存到文件 -> tmp.pdf
  2. my_duplex_script tmp.pdf
  3. rm tmp.pdf

有什么办法可以使它成为:

  1. 文件 -> 打印 -> my_script_as_virtual_printer

注意:这是在 Linux mint 13 cinnamon 上进行的。我已经尝试过gnome-manual-duplex,但它对我不起作用。


我可以从中打印到 PDF 文件的 GUI 对话框 标准 GTK 打印对话框

my_duplex_script

#!/bin/bash

lp_args=
while getopts o: opt
do
    case "$opt" in
        o)  lp_args="$lp_args -o $OPTARG" ;;
        \?) echo >&2 Invalid argument; exit 1 ;;
    esac
done
shift `expr $OPTIND - 1`

file=$1
page_count=$(pdfinfo "$file" | grep Pages | awk '{print $2}')
is_odd=`expr $page_count % 2`

if [ $is_odd -eq 1 ]
then
    #outputting blank
    echo | lp -s -t "$file"-blank
fi

#printing even reversed
lp -s -o page-set=even -o outputorder=reverse $lp_args -t "$file"-even "$file"

if zenity --question --text="Flip and reinsert the entire stack when printing has finished." --ok-label="Proceed" --cancel-label="Cancel"
then
    #printing odd reversed
    lp -s -o page-set=odd -o outputorder=reverse $lp_args -t "$file"-odd "$file"
else
    echo >&2 User abort
    exit 1
fi

exit 0

答案1

我从来没有尝试过这个,但有一个工具叫做tea4cups听起来您可以在脚本中实现一个 prehook 来进行打印。然后,您可以取消此打印,而不是通过杯子实际转到真正的打印机,而是允许您的脚本进行打印。

摘抄

可能性是无止境 :

  • 同时将同一作业发送到多台打印机,而这对于 CUPS 来说是不可能的。
  • 自动对所有打印作业进行 PDF 归档。
  • 禁止重复的打印作业(示例配置文件中显示了一个简单的示例)
  • 在 15 分钟内创建打印会计解决方案(是的,这是真的)
  • ETC...

Tea4cups 提供以下便利:

Tea4CUPS 提供了三种启动命令的方式:

  • 过滤器:过滤器可以在将输入数据发送到打印机或供下面定义的前挂钩和后挂钩使用之前修改输入数据。目前,每个打印队列可以定义一个过滤器。
  • prehooks :这些保证在打印作业发送到真实打印机之前启动。任何退出 -1 的 prehook 都可以取消打印作业。可以为特定的打印队列定义任意数量的预挂钩。
  • posthooks :这些保证在打印作业发送到真实打印机后启动,除非作业之前被 prehook 取消。可以为特定的打印队列定义任意数量的 posthook。

答案2

如何将此脚本添加为可从 GUI 中选择的虚拟打印机?

要添加虚拟打印机,只需编辑您的/etc/printcap.这不是很容易,因为语法 打印帽需要习惯。

这里显示了如何执行此操作的示例使用 Samba 的 PDF 服务:

# /etc/printcap
# PDF Service entry

lp|pdf|PDF Printer:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/pdf:\
        :af=/var/spool/lpd/pdf/acct:\
        :mx#0:sh:\
        :if=/usr/bin/smbprint:

这里/usr/bin/smbprint脚本用作打印过滤器。打印机本身是/dev/null.

也许您需要安装cups-bsd,但它通常是默认配置。

答案3

聚会迟到了,但我想做同样的事情,但没有找到任何其他解决方案。

我将在这里写下我是如何解决它的,也许其他人会发现该解决方案有用。

  • 制作了一个杯子过滤器来捕获要​​打印的文件
  • 做了一个后端来打印文件
  • 制作了一个漂亮且简单的安装程序。

源代码在github上: https://github.com/dentys03/manual_duplex_linux

它应该适用于任何 HP 打印机。我想很容易适应其他打印机。

相关内容