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

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

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

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


person Katie    schedule 25.06.2012    source источник
comment
Возможно, я неправильно понимаю вашу потребность, но Cocoa напрямую поддерживает создание PDF из документов/NSViews, вам не нужно устанавливать драйвер печати. Найдите документацию в формате PDF.   -  person CRD    schedule 26.06.2012
comment
Вот конкретный пример: у меня есть документ в Word, который я хочу отправить на свое устройство. Когда я делаю Файл ›› Печать, мне нужна опция принтера, которая запускает мое приложение и дает мне ссылки на PDF-файл текущего документа Word. (Мне все равно, когда файл станет PDF - я понимаю, что могу сделать это в своем приложении). Мне не нужно отображать PDF-файл в представлении, и я использовал функциональность PDFKit для управления файлами, но никогда не использовал опцию принтера. Если вы все еще считаете, что просмотр документации — это все, что мне нужно, не могли бы вы указать мне более конкретные ссылки? Спасибо.   -  person Katie    schedule 26.06.2012
comment
Как я и предполагал, я неправильно понял вашу потребность. Глядя на CUPS, вы выбрали хорошее место для поиска того, что вы пытаетесь сделать.   -  person CRD    schedule 27.06.2012


Ответы (2)


Путь таков:


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

person Kurt Pfeifle    schedule 25.06.2012
comment
Похоже, это именно то, что мне нужно! Спасибо, что нашли время, чтобы написать все это. Тем не менее, пожалуйста, потерпите меня, так как мое незнание CUPS и терминов для принтеров заставляет меня задавать подробные пошаговые вопросы, на которые вы, возможно, уже ответили. Ссылка на KDE Printing Developer Tools Wiki указывает, что 2dir должен быть сохранен в /usr/lib/cups/backend/, однако у меня, похоже, нет каталога cups в /usr/lib/. Я что-то пропустил? Кроме того, последний флаг для настройки начальной очереди, я предполагаю, что должен заменить путь, но чем именно? - person Katie; 29.06.2012
comment
@Katie: Извините, я имел в виду Linux с этим путем. В Mac OS X вам придется использовать /usr/libex/cups/backend/. Последний аргумент пути с пометкой -P вы можете заменить на /User/katie/postscript-printer.ppd... но, конечно, вы должны поместить туда настоящий PPD-файл PostScript-принтера с этим именем. - person Kurt Pfeifle; 29.06.2012
comment
Хорошо, я разобрался: pdfqueue — это опция принтера. Я полагаю, что следовал другим инструкциям, однако, когда я пытаюсь печатать, я получаю диалоговое окно, в котором говорится, что этот принтер был приостановлен. Вы хотите возобновить печать? С опциями «Отменить», «Добавить в очередь» или «Возобновить». Нажатие «Добавить в очередь» или «Возобновить» добавляет задание на печать, поэтому я могу видеть его в появившемся графическом интерфейсе принтера pdfqueue, но, похоже, не отвечает на возобновление и просто сидит там. /tmp/pdfqueue, похоже, не существует, поэтому я не совсем уверен, куда идет этот файл. Какие-либо предложения? - person Katie; 29.06.2012
comment
@Katie: добавьте строку LogLevel debug в файл /etc/cups/cupsd.conf и перезапустите CUPS (команды sudo launchctl ... выше). - person Kurt Pfeifle; 30.06.2012
comment
@Katie: О, возможно, это моя ошибка - в строке *cupsFilter: ..., которую я прописал вам выше, отсутствует пара кавычек. Добавьте их, пожалуйста, перезапустите CUPS и повторите попытку. Простите за это. - person Kurt Pfeifle; 30.06.2012
comment
Я изменил строку *cupsFilter:..., но, похоже, все еще испытываю ту же проблему. Я добавил LogLevel debug в файл cupsd.conf, но, кажется, не вижу никаких операторов эха (это то, что я ищу, верно?) Я даже перепечатал в текстовом редакторе терминала начало 2dir bash до конца первого фрагмента эха, чтобы убедиться, что это не проблема с новой строкой. - person Katie; 03.07.2012
comment
@Katie: После изменения LogLevel (или чего-либо еще) в cupsd.conf вам нужно перезапустить CUPS, прежде чем оно вступит в силу: sudo launchctl (un|)load /System/Library/LaunchDaemons/org.cups.cupsd.plist. Можете ли вы выполнить скрипт 2dir в терминале, чтобы он не выдавал ошибки Bash? - person Kurt Pfeifle; 10.07.2012
comment
Привет @KurtPfeifle, мне не удалось сгенерировать вывод, используя описанный выше метод. я использую мак ос - person Mohammad Sadiq Shaikh; 31.03.2016
comment
@MohammadSadiqShaikh: Ваша информация не содержит достаточно подробностей, чтобы даже начать думать о том, что могло пойти не так. Вы даже не говорите, какую версию OS X вы используете (знаете, в CUPS вносились изменения между разными версиями?)... - person Kurt Pfeifle; 31.03.2016
comment
я хочу, чтобы он работал на yosemite 10.10.5 и выше. - person Mohammad Sadiq Shaikh; 04.04.2016

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


  1. Загрузите исходный код с codepoet cups-pdf-for-mac-os-x. (Для компьютеров, не использующих Mac, вы можете посмотреть http://www.cups-pdf.de/). подробно, и если вы внимательно прочитаете все инструкции, это сработает, однако у меня были небольшие проблемы с получением всех частей, поэтому я точно опишу, что я сделал, в надежде избавить кого-то еще от некоторых проблем. Для этого каталог с исходным кодом называется «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) удалить чашки -pdf backend из /usr/libexec/cups/backend (2) удалите cups-pdf.conf из /etc/cups/ (3) Перейдите в «Системные настройки» >> «Печать и факс» и удалите принтер CUPS-PDF.


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

person Katie    schedule 03.07.2012
comment
Я думал, что ваша конечная цель состоит в том, чтобы 'распечатать любой документ пользователя в формате PDF и добавить несколько заголовков перед отправкой на устройство...'. Итак, как вы решили последнюю часть? (Мой ответ касался только первой части - из вашего вопроса я не знал, каковы подробные требования для второй части.) - person Kurt Pfeifle; 10.07.2012
comment
В итоге я отделил проблему с заголовком от создания PDF. После того, как я сгенерировал PDF-файл, я мог манипулировать данными через Cocoa PDFDocument в своем приложении, прежде чем отправлять их на устройство. - person Katie; 10.07.2012
comment
привет Кэти, я получаю эту ошибку (sampletopdf) остановлен со статусом 13 - person Mohammad Sadiq Shaikh; 31.03.2016