8

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

我想我的问题是:如何为将启动我一直在开发的应用程序的用户添加一个虚拟“打印机”驱动程序,该应用程序将制作 PDF(或制作 PDF 并启动我的应用程序并引用新生成的 PDF )? 如何与 CUPS 交互以生成 PDF?我不确定我是否清楚,所以让我知道更多信息是否会有所帮助。

我已经使用 CUPS 教程完成了此打印,并且似乎一切都设置好了,但该文件似乎从未出现在适当的临时位置。如果有人正在寻找用户端 PDF 打印机,那么这个 cups-pdf-for-mac-os-x是可以通过安装程序工作的,但是当我遇到相同的问题时,指定目录中没有文件出现下载源代码并按照自述文件中的说明进行操作。如果有人可以通过终端让这些中的任何一个在 Mac 上工作,请让我一步一步地知道你是如何做到的。

4

2 回答 2

12

要走的路是这样的:

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

  • 最初,使用名为2dir. 可以从这个网站复制那个:KDE Printing Developer Tools Wiki确保在复制时获得正确的行尾(类 Unix)。

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

    管理员\
        -p pdf队列\
        -v 2dir:/tmp/pdfqueue \
        -E\
        -P /path/to/postscript-printer.ppd
    
    后端现在2dir会将所有输出写入目录/tmp/pdfqueue/,并且它将为每个作业使用一个 uniq 名称。每个结果现在应该是一个 PostScript 文件。(还没有您想要的任何修改)。

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

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

    *cupsFilter: "应用程序/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 个引号。对不起!

于 2012-06-25T18:00:59.730 回答
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) 删除 cups-pdf.conf 从/etc/cups/(3) 进入系统偏好设置>>打印和传真并删除 CUPS-PDF 打印机。


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

于 2012-07-03T14:22:49.543 回答