2012-09-03 91 views
8

convierto PDF -> muchos JPEG y muchos JPEG -> muchos PDF usando ghostscript. Necesito agregar texto de marca de agua en cada página JPEG convertida (PDF). ¿Es posible usar solo Ghostscript y PostScript?¿Es posible en Ghostscript para añadir marca de agua a todas las páginas en PDF

La única manera que encontró:

gswin32c -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -sOutputFile=output.pdf watermark.ps input.pdf

Pero esto va a insertar watermark.ps marca de agua en la primera página independiente en output.pdf.

¿Puedo hacer esto en páginas PDF de salida directamente?

¿Puedo hacer esto en páginas JPEG de salida directamente?

<< 
    /BeginPage 
    { gsave 
     /Helvetica_Bold 120 selectfont 
     .85 setgray 130 70 moveto 50 rotate (Sample) show 
    grestore 
    } bind 
>> setpagedevice 

Si uso /EndPage en lugar de /BeginPage - dice setpagedevice no es aplicable ...

cómo rehacer el guión de esta /EndPage?

Respuesta

8

poco demasiado grande para un comentario, así que he añadido una nueva respuesta. El procedimiento EndPage (consulte la página 441 del Manual de referencia del lenguaje PostScript) toma dos parámetros adicionales en la pila, un recuento de páginas emitidas hasta el momento, y un código de razón.

Puede utilizar el recuento de páginas para hacer cosas interesantes como dúplex, o solo marcar páginas pares o lo que sea, pero supongo que en este caso no lo quiere, por lo que simplemente 'pop' de la pila.

El código de razón le dice por qué se está emitiendo la página, de nuevo probablemente no le importe, así que simplemente muestra el valor.

Finalmente, la EndPage debe devolver un valor booleano al intérprete que dice si se debe o no transmitir la página (esto le permite hacer otras cosas interesantes, como solo imprimir las primeras 10 páginas, etc.).

Así que primero necesita eliminar dos valores, ejecutar su código y devolver un valor booleano. Bastante trivial:

<< 
    /EndPage 
    { pop pop %% *BEFORE* gsave as that puts a gsave object on the stack 
    gsave 
    /Helvetica_Bold 120 selectfont 
    .85 setgray 130 70 moveto 50 rotate (Sample) show 
    grestore 
    true %% transmit the page, set to false to not transmit the page 
    } bind 
>> setpagedevice 
+0

Es casi correcto, excluyendo para cada página de marca de agua real, también agrega una página vacía con marca de agua y el PDF de salida tiene dos páginas más. – radistao

+0

Posiblemente el código 'razón' es el problema. Prueba esto:/EndPage {EXCH pop 2 lt {gsave ... grestore true} {false}} ifelse unen – KenS

+0

me hizo esto: ** << /EndPage {EXCH pop 2 si {gsave /120 Helvetica_Bold selectfont 0,85 setgray 130 70 moveto 50 rote (Muestra) muestran grestore cierto } {false} ifelse } se unen >> setpagedevice ** y causar error: 'error:/typecheck en -. endpage - '' Pila de Operand: --nostringval-- 2 2 2' – radistao

1

No sé a qué te refieres con 'directamente'. Es posible que, como haya descubierto, tener un intérprete PostScript haga muchas cosas por página. PostScript es un lenguaje de programación después de todo.

Sugeriría que los procedimientos/BeginPage y/o/EndPage en el diccionario del dispositivo de la página serían el lugar para comenzar. Esto le permite ejecutar PostScript arbitrario al inicio o al final de cada página.

Si se define un procedimiento/BeginPage entonces se ejecutará antes cualquier operación de marcado del programa de entrada, si se define un/EndPage entonces se ejecutará después las operaciones de marcado desde el programa de entrada (en una página por página (.

Esto le permite tener sus propias marcas se encuentran 'bajo' o 'sobre' las marcas del programa.

+0

he actualizado la pregunta con el ejemplo del código. ¿Puedes echar un vistazo? – radistao

3

La respuesta aceptada fue la inserción de páginas para mí. Las páginas estaban en blanco aparte de la marca de agua.Si se encuentra con este intento de añadir el bit 2 eq aquí

<< 
    /EndPage 
    { 
    2 eq { pop false } 
    { 
     gsave  
     /Helvetica_Bold 120 selectfont 
     .85 setgray 130 70 moveto 50 rotate (Sample) show 
     grestore 
     true 
    } ifelse 
    } bind 
>> setpagedevice 

he encontrado el siguiente sitio que me señaló en la dirección correcta

http://habjan.blogspot.com/2013/10/how-to-programmatically-add-watermark.html

Ésta es la sintaxis de llamada donde el archivo anterior se guarda como watermark.ps y gswin32c hace referencia a ghostscript exe

gswin32c -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=watermarked.pdf watermark.ps original.pdf 
+0

Esto de hecho funciona! –

Cuestiones relacionadas