如何在终端

时间:2015-12-18 14:41:06

标签: macos printing cups

在OSX中,我想从终端打印到文件。

我有两个解决方案,但都有缺点。

1。使用'cupsfilter'

cupsfilter -m application/vnd.cups-postscript \
     -p /etc/cups/ppd/my_printer.ppd \
     -o Duplex=DuplexNoTumble \
     -o PageSize=A4 \
     -o landscape my_document.pdf \
     > my_document.ps

(.ppd文件来自我的默认打印机)

我现在可以使用raw选项将此文件发送到打印机(避免任何杯子过滤器)

lp -o raw my_document.ps

但缺点是打印结果不正确,与我以正常方式打印到默认打印机时不一样。

lp -o Duplex=DuplexNoTumble -o PageSize=A4 -o landscape my_document.pdf 

在某些调查中,我可以看到两种方法的某些PJL标题不同。

- @PJL SET BINDING = SHORTEDGE
+ %@PJL SET BINDING = LONGEDGE

使用选项--list-filters运行cupsfilter命令时 我明白了:

cgpdftops
pstops

似乎运行了两个过滤器。我认为这是错误的,但我不确定,我不知道如何改变它。

2。创建文件后端

你可以这样做:

sudo lpadmin -p to_file \
   -P /etc/cups/ppd/my_printer.ppd \
   -E \
   -v file:///tmp/my_document.ps \
   -m raw

您可能会收到警告,并且必须取消注释/private/etc/cups/cups-files.conf中的以下行并将其设置为是

FileDevice Yes

然后重启杯子

sudo launchctl stop org.cups.cupsd
sudo launchctl start org.cups.cupsd

现在可以使用以下命令打印到文件:

lp -d to_file \
   -o Duplex=DuplexNoTumble \
   -o PageSize=A4 \
   -o landscape my_document.pdf

创建的.ps文件由root拥有,因此要将其打印到默认打印机,我必须使用sudo

sudo lp -o raw /tmp/my_document.ps

此解决方案的问题是(除了有文件权限的麻烦)我无法定义输出文件的名称。我不想为每个打印作业重新创建to_file后端。

那么有没有其他解决方案可以为我提供一个文件,其中包含完全相同的数据,否则会被发送到打印机?

2 个答案:

答案 0 :(得分:1)

看看这个答案:

它解释了如何设置我的 2dir 后端,它是您使用的 to_file 方法的扩展:

  • 您的 to_file 打印机有一个固定的输出文件名 /tmp/my_document.ps ,每次创建新作业时都会被覆盖。

  • 我的 2dir 后端为发送给它的每个作业使用相同的目录,但是它将作业ID,日期和时间放入每个新的作业文件名中,使其成为uniq。

这里描述的 2dir 从每个作业创建一个PDF。您可以轻松地在那里修改脚本以跳过创建PDF的最后一步,并保留将发送到打印机的任何文件类型。

答案 1 :(得分:0)

很久以前找到答案了,但是忘了回答我自己的问题

我目前分两个步骤进行操作,我创建了一个新的虚拟打印机Canon_IPC650_PS_to_file,该打印机使用打印机中的.ppd文件,并设置了文件名(后记文件)。

之后,我可以打印到该新的虚拟打印机,并且将创建postscript文件,包括我想要的所有选项。

lpadmin -p Canon_IPC650_PS_to_file -E -v file:'/Some/Path/name-of-postscript-file.ps' -m 'Library/Printers/PPDs/Contents/Resources/Canon_IPC650.ppd'
lp -d Canon_IPC650_PS_to_file some-file.pdf -o media="A4" -o InputSlot="Tray3"