2012-09-03 12 views
8

converto PDF -> molti JPEG e molti JPEG -> molti PDF utilizzando ghostscript. Ho bisogno di aggiungere il testo della filigrana su ogni pagina JPEG (PDF) convertita. È possibile utilizzare solo Ghostscript e PostScript?E 'possibile in Ghostscript per aggiungere filigrana a ogni pagina in PDF

L'unico modo che ho trovato:

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

Ma questo inserirà watermark.ps filigrana sulla prima pagina separata in output.pdf.

Posso farlo direttamente sulle pagine PDF di output?

È possibile eseguire questa operazione sulle pagine JPEG di output direttamente?

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

Se uso /EndPage invece di /BeginPage - dice setpagedevice non è applicabile ...

Come rifare questo script per /EndPage?

risposta

8

po 'troppo grande per un commento, così ho aggiunto una nuova risposta La procedura EndPage (vedere pagina 441 del Manuale di riferimento del linguaggio PostScript) richiede due ulteriori parametri nello stack, un conteggio di pagine emesse finora e un codice di motivazione.

È possibile utilizzare il conteggio delle pagine per fare cose interessanti come la stampa fronte/retro, o solo la marcatura di pagine pari o qualsiasi altra cosa, ma presumo che in questo caso non lo si voglia, quindi lo si "scarica" ​​dallo stack.

Il codice motivo indica il motivo per cui la pagina viene emessa, anche se probabilmente non ti interessa, basta che apri il valore.

Infine, l'EndPage deve restituire all'interprete un valore booleano che indica se trasmettere o meno la pagina (ciò consente di fare altre cose interessanti, ad esempio la stampa delle prime 10 pagine e così via).

Quindi è necessario rimuovere inizialmente due valori, eseguire il codice e restituire un valore booleano. Piuttosto banale:

<< 
    /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

Quasi corretto, escludendo ogni pagina con filigrana reale aggiunge anche una pagina vuota con filigrana e il PDF di output ha due pagine in più. – radistao

+0

Probabilmente il "motivo" è il problema. Prova questo:/EndPage {Exch pop 2 lt {gsave ... grestore true} {false}} IfElse legano – KenS

+0

ho fatto questo: ** << /EndPage {Exch pop 2 se {gsave /Helvetica_Bold 120 selectfont .85 setgray 130 70 50 moveto rotate (campione) mostrano grestore vero } {false} IfElse } legano >> setpagedevice ** ed è causa di errore: 'errore:/TYPECHECK in -. endpage - '' Stack Operand: --nostringval-- 2 2 2' – radistao

1

Non so cosa intendi con 'direttamente'. È possibile, come hai trovato, avere un interprete PostScript che fa molti tipi di cose per ogni pagina. PostScript è un linguaggio di programmazione, dopo tutto.

Suggerirei che le procedure/BeginPage e/o/EndPage nel dizionario del dispositivo di pagina sarebbero il punto di partenza. Questi ti permettono di eseguire PostScript arbitrario all'inizio o alla fine di ogni pagina.

Se si definisce una procedura/BeginPage allora verrà eseguito prima eventuali operazioni di marcatura dal programma di input, se si definisce un/EndPage allora verrà eseguito dopo le operazioni di marcatura del programma di input (su una pagina per pagina (.

Questo ti permette di avere i propri marchi si trovano 'in' o 'corso' i segni del programma.

+0

Ho aggiornato una domanda con un esempio di codice. Puoi dare un'occhiata? – radistao

3

La risposta accettata è stata l'inserimento di pagine per me. Le pagine erano vuote a parte la filigrana.Se si esegue in questa prova ad aggiungere il bit 2 eq qui

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

ho trovato il seguente sito che mi ha segnalato nella direzione corretta

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

Ecco la sintassi di chiamata in cui il file di cui sopra viene salvato come watermark.ps e gswin32c fa riferimento al ex ghostscript

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

Questo funziona davvero! –