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

Kat*_*tie 8 printing pdf cocoa cups

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

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

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

Kur*_*fle 11

要走的路是这样的:

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

  • 最初,使用名为的(教育)CUPS后端2dir.可以从这个网站复制一个: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文件.(没有你想要的修改).

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

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

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

  • 重新启动CUPS调度程序:

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

  • 从现在起,您pdfqueue会导致打印到它各项工作最终为PDF/tmp/pdfqueue/*.pdf.

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

  • 修改2dir在节约结果之前将您所需的修改到PDF的方式/tmp/pdfqueue/*.pdf...


更新: 看起来我在*cupsFilter: ...上面原来规定的行中忘了2个引号.抱歉!


Kat*_*tie 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.


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


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