2012-06-25 51 views
8

Bien, entonces esto es lo que quiero hacer. Deseo agregar una opción de impresión que imprima todo el documento del usuario en un PDF y agrega algunos encabezados antes de enviarlo a un dispositivo.Programando un Filtro/Backend para 'Imprimir en PDF' con CUPS desde cualquier aplicación de Mac OS X

Supongo que mis preguntas son: ¿cómo agrego un controlador de "impresora" virtual para el usuario que lanzará la aplicación que he estado desarrollando que hará el PDF (o crear el PDF y ejecutar mi aplicación con referencias a el PDF recién generado)? ¿Cómo me relaciono con CUPS para generar el PDF? No estoy seguro de ser claro, así que avíseme si hay más información útil.

He trabajado con this printing with CUPS tutorial y parece que todo está bien configurado, pero el archivo nunca parece aparecer en la ubicación temporal adecuada. Y si alguien está buscando una impresora PDF de final de usuario, this cups-pdf-for-mac-os-x es una que funciona a través del instalador, sin embargo tengo el mismo problema de que no aparece ningún archivo en el directorio indicado cuando descargo la fuente y sigo las instrucciones en el archivo Léame. Si alguien puede hacer que cualquiera de estos trabaje en un mac a través de la terminal, por favor dígame paso a paso cómo lo hizo.

+0

Tal vez malinterprete su necesidad, pero Cocoa admite directamente la producción de PDF a partir de documentos/'NSView's, no necesita instalar un controlador de impresión. Busque la documentación de "PDF". – CRD

+0

Aquí hay un ejemplo específico: Tengo un documento en Word que deseo enviar a mi dispositivo. Cuando hago Archivo >> Imprimir, quiero una opción de impresora que inicie mi aplicación y me dé referencias al PDF de la palabra actual doc. (No me importa mucho cuando el archivo se convierte en PDF; me doy cuenta de que puedo hacerlo en mi aplicación). No necesito mostrar el PDF en una vista, y he usado la funcionalidad PDFKit para manipular archivos, pero nunca desde la opción de la impresora. Si todavía crees que solo necesito buscar la documentación, ¿podrías dirigirme a referencias más específicas? Gracias. – Katie

+0

Como pensé que podría ser, estaba malinterpretando su necesidad. Al mirar CUPS has elegido un buen lugar para buscar lo que estás tratando de hacer. – CRD

Respuesta

5

Realmente me gustaría poder aceptar dos respuestas porque no creo que hubiera podido hacer esto sin toda la ayuda de @Kurt Pfeifle para detalles de Mac y solo para entender los controladores de impresora y la ubicación de los archivos. Pero esto es lo que hice:


  1. descargar el código fuente de la codepoet cups-pdf-for-mac-os-x. (Para los que no sean Mac, puede mirar http://www.cups-pdf.de/) El archivo Léame es muy detallado y si lee todas las instrucciones cuidadosamente, funcionará, sin embargo, tuve un pequeño problema para obtener todas las piezas, así que esbozaré exactamente lo que hice con la esperanza de salvar a alguien más un problema. Para esto, el directorio con el código fuente se llama "cups-pdfdownloaddir".

  2. Compilar tazas-pdf.c contenida en la carpeta src como el readme especifica:

    gcc -09 -s -lcups -o cups-pdf cups-pdf.c

    Puede haber una advertencia: ld: warning: option -s is obsolete and being ignored, pero esto plantea ningún problema para mí. Copie el binario en/usr/libexec/cups/backend. Es probable que tenga que utilizar el comando sudo, que le pedirá su contraseña. Por ejemplo:

    sudo cp /cups-pdfdownloaddir/src/cups-pdf /usr/libexec/cups/backend

    Además, no se olvide de cambiar los permisos de este fichero - que necesita permisos de root (700) que se puede cambiar con la siguiente después de mover cupd-pdf en el directorio backend :

    sudo chmod 700 /usr/libexec/cups/backend/cups-pdf

  3. Editar el archivo contenido en /cups-pdfdownloaddir/extra/cups-pdf.conf. En el encabezado "Configuración de conversión de PDF", busque una línea debajo de GhostScript que dice #GhostScript /usr/bin/gs. No lo descomente en caso de que lo necesite, sino que simplemente agregué debajo de él la línea Ghostscript /usr/bin/pstopdf. (No debe haber ningún precursor # para cualquiera de estas modificaciones)

    encontrar la línea bajo GSCall que lee #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 Una vez más, sin descomentando esto, en virtud de este añadí la línea GSCall %s %s -o %s %s

    Encuentra la línea bajo PDFVer que lee #PDFVer 1.4 y cámbielo a PDFVer, sin espacios ni caracteres siguientes.

    Ahora guardar y salir de la edición antes de copiar el archivo en/etc/cups con el siguiente comando

    sudo cp cups-pdfdownloaddir/extra/cups-pdf.conf /etc/cups

    Tenga cuidado de la edición en un editor de texto, porque los saltos de línea en entornos UNIX y Mac son diferentes y potencialmente puede arruinar las secuencias de comandos.Siempre puedes usar un comando perl para eliminarlos, pero estoy paranoico y prefiero no tratarlo en primer lugar.

  4. Ahora debería poder abrir un programa (por ejemplo, Word, Excel, ...) y seleccionar Archivo >> Imprimir y encontrar una impresora disponible llamada CUPS-PDF. Imprima en esta impresora, y debería encontrar sus pdfs en/var/spool/cups-pdf/yourusername/de forma predeterminada.


* Además, pensé que esto podría ser útil, ya que me ayudó: si algo se metió la pata en el seguimiento de estas direcciones y hay que empezar de nuevo/deshacerse de él, con el fin de eliminar el controlador que necesita (1) eliminar el backend cups-pdf de /usr/libexec/cups/backend (2) eliminar cups-pdf.conf de /etc/cups/ (3) Vaya a Preferencias del sistema >> Imprimir & Envíe por fax y elimine la impresora CUPS-PDF.


Éste es cómo establecido con éxito un motor pdf/filtro para mí, sin embargo, hay más detalles, y otra información sobre la personalización contenida en el archivo readme. ¡Espero que esto ayude a alguien más!

+1

Pensé que su objetivo final era * imprimir cualquier documento del usuario en un PDF y ** agregar algunos encabezados antes de enviarlo a un dispositivo ** ... *. Entonces, ¿cómo resolviste la última parte? (Mi respuesta solo cubrió la primera parte; no supe por su pregunta cuáles eran los requisitos detallados para la segunda parte). –

+0

Terminé separando el problema del encabezado de generar un PDF. Una vez que obtuve el PDF generado, pude manipular los datos a través del PDFDocument de Cocoa dentro de mi aplicación antes de enviarlo al dispositivo. – Katie

+0

hola Katie, obtengo este error (sampletopdf) detenido con estado 13 –

10

El camino a seguir es la siguiente:

  • configurar una cola de impresión con cualquier conductor que desee. Pero recomiendo usar un controlador PostScript/PPD. (Un PPD PostScript es uno que no contiene ninguna línea *cupsFilter: ...):

  • Inicialmente, utilice el servidor de CUPS (educativo) denominado 2dir. Ese se puede copiar desde este sitio web: KDE Printing Developer Tools Wiki. Al copiar, asegúrese de obtener los finales de línea correctos (como Unix).

  • de comandos para configurar la cola inicial:

    lpadmin \ 
        -p pdfqueue \ 
        -v 2dir:/tmp/pdfqueue \ 
        -E \ 
        -P /path/to/postscript-printer.ppd 
    
    El backend 2dir ahora escribirá toda la salida al directorio /tmp/pdfqueue/ y utilizará un nombre uniq para cada trabajo. Cada resultado debería por ahora ser un archivo PostScript. (sin ninguna de las modificaciones que desea).

  • Busque el PPD utilizado por esta cola en /etc/cups/ppd/ (su nombre debería ser pdfqueue.ppd).

  • Añadir la siguiente línea (mejor, cerca de la parte superior de la PPD):

     
    *cupsFilter: "application/pdf 0 -"
    (Asegúrese de que los *cupsFilter se inicia desde el principio de la línea.) Esta línea le dice cupsd de auto-configuración de una cadena de filtrado que produce PDF y luego llame al último filtro llamado '-' antes de enviar el archivo a través de un backend a una impresora. Ese filtro '-' es especial: no hace nada, es un passthrough filtro.

  • Re-iniciar el planificador de CUPS:

    sudo launchctl unload /System/Library/LaunchDaemons/org.cups.cupsd.plist 
    sudo launchctl load /System/Library/LaunchDaemons/org.cups.cupsd.plist

  • A partir de ahora su pdfqueue hará que cada trabajo impreso a él para acabar como PDF en /tmp/pdfqueue/*.pdf.

  • Estudia el script de backend 2dir. Es simple Bash, y razonablemente bien comentado.

  • Modificar el 2dir de una manera que añade sus modificaciones deseadas en el archivo PDF antes de guardar el resultado en /tmp/pdfqueue/*.pdf ...


Actualización: Parece que se me olvidó en 2 citas mi línea prescrita originalmente *cupsFilter: ... arriba. ¡Lo siento!

+0

¡Esto suena exactamente a lo que necesito! Gracias por tomarse el tiempo para escribir todo esto. Sin embargo, tenga paciencia conmigo ya que mi falta de familiaridad con las CUPS y los términos de la impresora me hace formular preguntas paso a paso que quizás ya haya respondido. El enlace al Wiki de KDE Printing Developer Tools especifica que 2dir se debe guardar en/usr/lib/cups/backend /, sin embargo, parece que no tengo un directorio cups en/usr/lib /. ¿Me he perdido algo? Además, la última bandera para configurar la cola inicial, supongo que se supone que debo reemplazar la ruta, pero ¿con qué exactamente? – Katie

+1

@Katie: Lo siento, tenía Linux pensando en ese camino. En Mac OS X, deberá usar '/ usr/libex/cups/backend /'. El último argumento de ruta marcada con '-P' puede reemplazarlo por'/User/katie/postscript-printer.ppd' ... pero, por supuesto, debe colocar allí un PPD de impresora PostScript real con ese nombre. –

+0

De acuerdo, entendí eso: pdfqueue es una opción de impresora. Creo que seguí las otras instrucciones, sin embargo, cuando intento imprimir, aparece un cuadro de diálogo que dice "Esta impresora se ha detenido. ¿Desea que se reanude la impresión?" Con opciones para cancelar, agregar a la cola o reanudar. Al presionar Agregar a cola o Reanudar se agrega el trabajo de impresión para que pueda verlo en la GUI de la impresora en pdfqueue que apareció, pero no parece responder al currículum y simplemente se sienta allí./tmp/pdfqueue no parece existir, por lo que no estoy muy seguro de a dónde va este archivo. ¿Alguna sugerencia? – Katie