使用CUPS从任何Mac OS X应用程序将过滤器/后端编程为“打印到PDF”

时间:2012-06-25 15:31:57

标签: cocoa pdf printing cups

好的,这就是我想要做的。我想添加一个打印选项,将用户文档的任何内容打印到PDF,并在将其发送到设备之前添加一些标题。

我想我的问题是:如何为用户添加虚拟“打印机”驱动程序,该驱动程序将启动我正在开发的将生成PDF的应用程序(或制作PDF并启动我的应用程序,并引用新生成的PDF)?如何与CUPS连接以生成PDF?我不确定我是否清楚,所以如果有更多信息可以帮助我,请告诉我。

我已经完成了this printing with CUPS tutorial,似乎可以将所有设置都设置好,但文件似乎永远不会出现在相应的临时位置。如果有人正在寻找一个用户端PDF打印机,this cups-pdf-for-mac-os-x是一个通过安装程序工作的打印机,但是当我下载源代码并按照说明操作时,我在指定的目录中出现相同的问题。在自述文件中。如果有人可以通过终端让这些中的任何一个在Mac上工作,请逐步告诉我你是如何做到的。

2 个答案:

答案 0 :(得分:11)

要走的路是:

  • 使用您喜欢的任何驱动程序设置打印队列。但我建议使用PostScript驱动程序/ PPD。 (PostScript PPD是一个不包含任何*cupsFilter: ...行的PPD。):

  • 最初,使用名为2dir的(教育)CUPS后端。可以从这个网站复制一个:KDE Printing Developer Tools Wiki确保复制时你得到的行结尾是正确的(类Unix)。

  • 设置初始队列的命令行:

    lpadmin \
        -p pdfqueue \
        -v 2dir:/tmp/pdfqueue \
        -E \
        -P /path/to/postscript-printer.ppd
    
    2dir后端现在将所有输出写入目录/tmp/pdfqueue/,并且每个作业都使用uniq名称。每个结果 现在应该是PostScript文件 。 (没有你想要的修改)。

  • /etc/cups/ppd/中找到此队列使用的PPD(其名称应为pdfqueue.ppd)。

  • 添加以下行(最好,靠近PPD顶部):

    *cupsFilter: "application/pdf  0  -"
    (确保*cupsFilter从行的最开始处开始。) line告诉cupsd自动设置生成PDF的过滤链,然后在通过后端将文件发送到打印机之前调用名为'-'的最后一个过滤器。 '-'过滤器是一个特殊过滤器:它什么都不做,它是 passthrough 过滤器。

  • 重新启动CUPS计划程序:

    sudo launchctl unload /System/Library/LaunchDaemons/org.cups.cupsd.plist
    sudo launchctl load /System/Library/LaunchDaemons/org.cups.cupsd.plist

  • 从现在开始,pdfqueue将导致打印到其中的每个作业在/tmp/pdfqueue/*.pdf中以 作为PDF 结束。

  • 研究2dir后端脚本。这是简单的Bash,并且得到了相当好的评论。

  • 修改2dir,以便在/tmp/pdfqueue/*.pdf ...

  • 中保存结果之前,将所需的修改添加到PDF中

更新:我上面原先规定的*cupsFilter: ...行似乎忘记了2个引号。遗憾!

答案 1 :(得分:5)

我真的希望我能接受两个答案,因为如果没有@Kurt Pfeifle对Mac特定内容的帮助并且只是理解打印机驱动程序和文件位置,我不认为我可以做到这一点。但这就是我所做的:


  1. 从codepoet cups-pdf-for-mac-os-x下载源代码。 (对于非mac,您可以查看http://www.cups-pdf.de/)自述文件非常详细,如果您仔细阅读所有说明,它将会起作用,但是我在获取所有部分时遇到了一些麻烦,所以我将概述正是我为了拯救别人一些麻烦所做的一切。为此,带有源代码的目录名为“cups-pdfdownloaddir”。

  2. 编译src文件夹中包含的cups-pdf.c作为自述文件指定:

    gcc -09 -s -lcups -o cups-pdf cups-pdf.c

    可能会有警告:ld: warning: option -s is obsolete and being ignored,但这对我没有任何问题。将二进制文件复制到/ usr / libexec / cups / backend。您可能需要sudo命令,它会提示您输入密码。例如:

    sudo cp /cups-pdfdownloaddir/src/cups-pdf /usr/libexec/cups/backend

    另外,不要忘记更改此文件的权限 - 它需要root权限(700),将cupd-pdf移动到后端目录后可以使用以下内容进行更改:

    sudo chmod 700 /usr/libexec/cups/backend/cups-pdf

  3. 编辑/cups-pdfdownloaddir/extra/cups-pdf.conf中包含的文件。在“PDF转换设置”标题下,在GhostScript下找到一条读取#GhostScript /usr/bin/gs的行。如果我需要它,我没有取消注释,只是在它下面添加了行Ghostscript /usr/bin/pstopdf。 (任何这些修改都不应该有前缀#)

    在GSCall下找到读取#GSCall %s -q -dCompatibilityLevel=%s -dNOPAUSE -dBATCH -dSAFER -sDEVICE=pdfwrite -sOutputFile="%s" -dAutoRotatePage\ s=/PageByPage -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dPDFSETTINGS=/prepress -c .setpdfwrite \ -f %s的行再次在没有取消注释的情况下,在此我添加了行GSCall %s %s -o %s %s

    在PDFVer下找到读取#PDFVer 1.4并将其更改为PDFVer,没有空格或跟随字符的行。

    现在保存并退出编辑,然后使用以下命令将此文件复制到/ etc / cups

    sudo cp cups-pdfdownloaddir/extra/cups-pdf.conf /etc/cups

    小心在文本编辑器中进行编辑,因为UNIX和Mac环境中的换行符不同,可能会破坏脚本。您总是可以使用perl命令删除它们,但我是偏执狂,并且首先不想处理它。

  4. 您现在应该可以打开程序(例如Word,Excel,...)并选择文件>>打印并找到名为CUPS-PDF的可用打印机。打印到此打印机,您应该在/ var / spool / cups-pdf / yourusername /中找到您的pdf。


  5. *另外,我认为这可能会有所帮助,因为它帮助了我:如果在遵循这些指示时出现问题,你需要重新开始/删除它,以便删除你需要的驱动程序(1)从/usr/libexec/cups/backend移除cups-pdf后端(2)从/etc/cups/移除cups-pdf.conf(3)进入系统偏好设置>>打印&传真并删除CUPS-PDF打印机。


    这是我为自己成功设置pdf后端/过滤器的方法,但是有更多详细信息,以及自述文件中包含的有关自定义的其他信息。希望这有助于其他人!