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

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

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

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

2 ответа

Решение

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


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

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


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


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

Путь к этому заключается в следующем:

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

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

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

     lpadmin \
        -p pdfqueue \
        -v 2dir: / tmp / pdfqueue \
        -Е \
        -P /path/to/postscript-printer.ppd
    
    2dir теперь бэкэнд запишет весь вывод в каталог /tmp/pdfqueue/ и он будет использовать уникальное имя для каждой работы. Каждый результат должен быть пока файлом 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...


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

Другие вопросы по тегам