Программирование фильтра / бэкэнда для "печати в PDF" с помощью CUPS из любого приложения Mac OS X

хорошо, вот что я хочу сделать. Я хочу добавить опцию печати, которая печатает любой документ пользователя в PDF и добавляет некоторые заголовки перед отправкой его на устройство.

Я думаю, мои вопросы: Как добавить виртуальный драйвер "принтера" для пользователя, который запустит приложение, которое я разрабатывал, которое сделает PDF (или сделает PDF и запустит мое приложение со ссылками на недавно созданный PDF)? Как мне взаимодействовать с CUPS для создания Формат PDF? Я не уверен, что я ясно, поэтому дайте мне знать, если дополнительная информация будет полезной.

Я проработал эта печать с учебником чашки и, похоже, все настроено нормально, но файл никогда не появляется в соответствующем временном месте. И если кто-то ищет пользовательский PDF-принтер, это чашки-pdf-для-mac-os-x это тот, который работает через установщик, однако у меня та же проблема, что и без файла, появляющегося в указанном каталог, когда я загружаю источник и следую инструкциям в readme. Если кто-нибудь может заставить любой из них работать на mac через терминал, пожалуйста, дайте мне знать шаг за шагом, как вы это сделали.

2 ответов


путь такой:

  • настройте очередь печати с любым драйвером, который вам нравится. Но я рекомендую использовать драйвер PostScript / PPD. (Постскриптум PPD-это тот, который не содержит *cupsFilter: ... линии.):

  • первоначально используйте (образовательный) бэкэнд CUPS с именем 2dir. Что можно скопировать с этого сайта: KDE Printing Developer Tools Wiki. убедитесь, что при копировании вы получаете окончания строк справа (Unix-like).

  • Командная строка для настройки начальной очереди:

    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, а затем вызывает последний фильтр с именем '-' перед отправкой файла через бэкэнд на принтере. Это '-' фильтр особенный: он ничего не делает, это passthrough фильтр.
  • повторно запустите планировщик 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...


обновление: похоже, я забыл 2 цитаты в моем изначально прописал *cupsFilter: ... выше линии. Прости!


я действительно хотел бы принять два ответа, потому что я не думаю, что я мог бы сделать это без всей помощи @Kurt Pfeifle для специфики Mac и просто понимания драйверов принтера и местоположения файлов. Но вот что я сделал:--15-->


  1. загрузите исходный код из codepoet cups-pdf-for-mac-os-x. (Для не-macs, вы можете посмотреть наhttp://www.cups-pdf.de/) readme очень подробно, и если Вы читаете все инструкции тщательно, это будет работать, однако у меня были небольшие проблемы с получением всех частей, поэтому я расскажу точно, что я сделал в надежде спасти кого-то еще от некоторых проблем. Для этого каталог с исходным кодом называется "cups-pdfdownloaddir".

  2. Compile cups-pdf.c содержится в папке src, как указывает readme:

    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 / чашки-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. Печать на этом принтере, и вы должны найти свои PDF-файлы в /var/spool/cups-pdf/ yourusername / по умолчанию.


*кроме того, я подумал, что это может быть полезно, потому что это помогло мне: если что-то напортачил в следующих направлениях, и вы должны начать все сначала/избавиться из этого, чтобы удалить драйвер, вам нужно (1) удалить сервер cups-pdf из /usr/libexec/cups/backend (2) Удалите cups-pdf.conf с /etc/cups/ (3) перейдите в Системные настройки >> печать и факс и удалите принтер CUPS-PDF.


вот как я успешно настроил бэкэнд/фильтр pdf для себя, однако есть более подробная информация и другая информация о настройке, содержащаяся в файле readme. Надеюсь, это поможет кому-то еще!