Программирование фильтра / бэкэнда для печати в 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 и только понимания драйверов принтера и расположения файлов. Но вот что я сделал:
Загрузите исходный код из codepoet cups-pdf-for-mac-os-x. (Для не-macs, вы можете посмотреть на http://www.cups-pdf.de/) Readme очень подробно и если вы внимательно прочитаете все инструкции, он будет работать, однако у меня возникли небольшие проблемы с получением всех кусочки, поэтому я в общих чертах опишу, что я сделал в надежде спасти кого-то еще от неприятностей. Для этого каталог с исходным кодом называется "cups-pdfdownloaddir".
Скомпилируйте 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
Отредактируйте файл, содержащийся в /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, чтобы удалить их, но я параноик и предпочитаю не иметь с этим дело в первую очередь.
Теперь вы должны иметь возможность открыть программу (например, 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: ...
строка выше. Сожалею!