2012-09-03 11 views
8

przekonwertować PDF -> wiele JPEG i wiele JPEG -> wiele PDF użyciu ghostscript. Muszę dodać tekst znaku wodnego na każdej przekonwertowanej stronie JPEG (PDF). Czy możliwe jest używanie tylko Ghostscript i PostScript?Czy jest możliwe w Ghostscript dodanie znaku wodnego do każdej strony w formacie PDF

Jedynym sposobem znalazłem:

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

Ale to wstawi watermark.ps znak wodny na pierwszym oddzielnej stronie w output.pdf.

Czy mogę to zrobić bezpośrednio na wyjściowych stronach PDF?

Czy mogę to zrobić bezpośrednio na wyjściowych stronach JPEG?

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

Jeśli używam /EndPage zamiast /BeginPage - to mówi setpagedevice to nie dotyczy ...

Jak przerobić ten skrypt dla /EndPage?

Odpowiedz

8

zbyt duży na komentarz, więc dodałem nowa odpowiedź Procedura EndPage (patrz strona 441 podręcznika języka PostScript) pobiera dwa dodatkowe parametry na stosie, liczbę stron wysłanych do tej pory i kod przyczyny.

Możesz używać liczby stron do robienia interesujących rzeczy, takich jak drukowanie dwustronne, lub tylko oznaczanie stron nawet, ale zakładam, że w tym przypadku nie chcesz tego, więc po prostu "wyskakuj" ze stosu.

Kod przyczyny informuje, dlaczego strona jest emitowana, ponownie prawdopodobnie nie obchodzi Cię, więc po prostu wyskakuj wartość.

Wreszcie strona końcowa musi zwrócić wartość logiczną do tłumacza, informującą o tym, czy strona ma być przesyłana (pozwala to na wykonywanie innych interesujących czynności, takich jak drukowanie pierwszych 10 stron itd.).

Musisz najpierw usunąć dwie wartości, wykonać kod i zwrócić wartość boolowską. Całkiem trywialne:

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

To prawie poprawne, wykluczając dla każdej prawdziwej strony ze znakiem wodnym, dodaje również pustą stronę ze znakiem wodnym, a wyjściowy plik PDF ma dwa razy więcej stron. – radistao

+0

Prawdopodobnie problemem jest kod "przyczyny". Spróbuj tego:/EndPage {EXCH pop 2 lt {gsave ... grestore true} {false}} ifelse wiążą – KenS

+0

Zrobiłem to: ** << /EndPage {Exch pop 2 jeśli {gsave /Helvetica_Bold 120 selectfont 0,85 setgray 130 70 moveTo 50 obracają (próbki) wskazują grestore prawdziwego } {fałszywego} ifelse } wiążą >> setpagedevice ** i powodować błąd: 'błąd:/typecheck w -. endpage - '' Operand stack: --nostringval-- 2 2 2'' – radistao

1

Nie wiem, co masz na myśli przez "bezpośrednio". Jest to możliwe, jak można się przekonać, mieć interpreter PostScript zrobić wiele rodzajów rzeczy na stronie. PostScript jest jednak językiem programowania.

Sugerowałbym, że miejscem początkowym byłyby procedury/BeginPage i/lub/EndPage w słowniku urządzenia stron. Umożliwiają one wykonanie dowolnego PostScript na początku lub na końcu każdej strony.

Jeśli określenie procedury/BeginPage następnie zostanie wykonany przed żadnych operacji znakowania z programu wejściowego, jeśli zdefiniować/EndPage następnie zostanie wykonany po operacji znakowania z programu wejściowej (na strona dla każdego widoku (.

To pozwala mieć własne znaki leżą „w” lub „na” znaków z programu.

+0

Mam zaktualizowane pytanie z przykładem kodu. Czy możesz rzucić okiem? – radistao

3

Przyjęto odpowiedź polegającą na wstawianiu stron dla mnie. Strony były puste poza znakiem wodnym.Jeśli napotkasz tego warto dodać tutaj bitu 2 równoważniki

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

znalazłem następujące miejsca, które wskazał mi w prawidłowym kierunku

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

oto Składnia wywołania gdzie powyższy plik zostanie zapisany jako watermark.ps i gswin32c odwołuje się do ghostscript exe

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

To naprawdę działa! –

Powiązane problemy