Automatize marca-d’água em PDFs com Ghostscript
O Ghostscript é uma ferramenta poderosa e de código aberto para manipular PDFs, com recursos robustos para marca-d’água, compressão e processamento de documentos. Este guia mostra como usar o Ghostscript para adicionar uma marca-d’água de texto visível em todas as páginas e, opcionalmente, reduzir a resolução das imagens para obter um arquivo menor. Trabalhe com cópias: a reescrita de PDFs pode alterar formulários, anotações, cores e assinaturas.
Instale e configure o Ghostscript
Instale um pacote do Ghostscript com suporte e correções de segurança. Em sistemas Ubuntu e baseados em Debian:
sudo apt-get update
sudo apt-get install ghostscript
No macOS, com Homebrew:
brew install ghostscript
Verifique a instalação e a versão:
gs --version
Crie uma marca-d’água com um procedimento EndPage
O Ghostscript pode executar um procedimento PostScript EndPage depois de desenhar cada página do
PDF. Ao contrário de uma anotação avulsa ou de um comando executado depois do PDF, isso desenha o
texto em todas as páginas geradas. Crie watermark.ps no seu diretório de trabalho:
%!PS-Adobe-3.0
<< /EndPage {
2 eq {
pop false
} {
pop
gsave
initgraphics
4 dict begin
/size currentpagedevice /PageSize get def
/label (CONFIDENTIAL) def
size 0 get 2 div size 1 get 2 div translate
/Helvetica-Bold findfont 36 scalefont setfont
/side size aload pop 2 copy gt { exch } if pop def
/factor side 0.8 mul label stringwidth pop div def
factor 1 lt { factor dup scale } if
45 rotate
0.75 setgray
label dup stringwidth pop -2 div 0 moveto show
end
grestore
true
} ifelse
} >> setpagedevice
Redefinir o estado gráfico mantém o posicionamento independente da rotação da página do PDF. O texto é reduzido em páginas estreitas para que a marca-d’água completa fique dentro da página.
Aplique a marca-d’água com segurança
Execute isto em um diretório que não tenha um watermarked.pdf existente. Carregue o procedimento antes
do PDF de entrada. Sem substituições do tamanho do papel, as dimensões das páginas de entrada são
preservadas:
gs -dSAFER \
-dBATCH \
-dNOPAUSE \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.7 \
-dPDFSETTINGS=/prepress \
-sOutputFile=watermarked.pdf \
-f watermark.ps input.pdf
Otimize a compressão de PDFs
O Ghostscript oferece predefinições que trocam qualidade de imagem por tamanho de arquivo. Não há garantia de que o resultado seja menor, e este comando separado não adiciona marca-d’água:
gs -dSAFER \
-dBATCH \
-dNOPAUSE \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.7 \
-dPDFSETTINGS=/ebook \
-sOutputFile=compressed.pdf \
input.pdf
Opções disponíveis de -dPDFSETTINGS:
/screen: saída em baixa resolução, com alvo de redução de amostragem de 72 dpi para cores/tons de cinza./ebook: saída em resolução média, com alvo de redução de amostragem de 150 dpi para cores/tons de cinza./printer: saída voltada para impressão, com alvo de redução de amostragem de 300 dpi para cores/tons de cinza./prepress: configurações voltadas para pré-impressão; não garantem que todos os valores de cor permaneçam inalterados./default: saída de uso geral, sem a promessa de preservar todas as configurações originais.
Consulte a documentação de saída PDF do Ghostscript para ver as configurações completas das predefinições. Inspecione o resultado visualmente antes de substituir um documento de origem.
Script de automação aprimorado
Salve isto como process.sh ao lado de watermark.ps e depois execute bash process.sh input.pdf new-results.
O diretório de saída não pode existir previamente. Uma etapa com falha remove apenas a saída desta
execução; o PDF original e os diretórios de resultados existentes permanecem intactos.
#!/bin/bash
set -euo pipefail
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <input-pdf> <new-output-directory>" >&2
exit 1
fi
INPUT_FILE=$1
OUTPUT_DIR=$2
WATERMARK_FILE=$PWD/watermark.ps
STAMPED_FILE=stamped.pdf
COMPRESSED_FILE=compressed.pdf
[[ $INPUT_FILE = /* ]] || INPUT_FILE=$PWD/$INPUT_FILE
[[ $OUTPUT_DIR = /* ]] || OUTPUT_DIR=$PWD/$OUTPUT_DIR
if [ ! -f "$INPUT_FILE" ]; then
echo "Error: Input PDF not found" >&2
exit 1
fi
if [ ! -f "$WATERMARK_FILE" ]; then
echo "Error: watermark.ps not found in the working directory" >&2
exit 1
fi
if ! mkdir -m 700 -- "$OUTPUT_DIR"; then
echo "Error: Use a new output directory" >&2
exit 1
fi
cleanup() {
local status=$?
if [ "$status" -ne 0 ]; then
rm -f -- "$OUTPUT_DIR/$STAMPED_FILE" "$OUTPUT_DIR/$COMPRESSED_FILE"
rmdir -- "$OUTPUT_DIR"
fi
}
trap cleanup EXIT
cd -P -- "$OUTPUT_DIR"
OUTPUT_DIR=$PWD
process_pdf() {
local output=$1
local settings=$2
shift 2
if ! gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite \
-dCompatibilityLevel=1.7 -dPDFSETTINGS="$settings" \
-sOutputFile="$output" -f "$@"; then
echo "Error: PDF processing failed" >&2
exit 1
fi
}
echo "Adding watermark..."
process_pdf "$STAMPED_FILE" /prepress "$WATERMARK_FILE" "$INPUT_FILE"
echo "Optimizing file size..."
process_pdf "$COMPRESSED_FILE" /ebook "$OUTPUT_DIR/$STAMPED_FILE"
echo "Processing complete: $OUTPUT_DIR/$COMPRESSED_FILE"
Considerações de segurança
Ao processar PDFs com o Ghostscript:
- Mantenha
-dSAFERativado; ele restringe o acesso a arquivos, mas não é um sandbox completo. - Verifique os arquivos de entrada antes do processamento
- Use permissões de arquivo adequadas para os arquivos de saída
- Mantenha o Ghostscript atualizado para a versão mais recente para receber correções de segurança
- Confira a contagem de páginas, as dimensões, a marca-d’água visível e o conteúdo renderizado após o processamento.
Execute documentos não confiáveis em uma conta restrita do sistema operacional ou em um contêiner
isolado, com limites de tempo e memória. Trate watermark.ps como código executável: mantenha-o confiável e
não insira nele entradas de usuário sem escape. Uma marca-d’água visível não criptografa o documento
nem impede cópias.
Compatibilidade de versões
Use uma versão do Ghostscript com manutenção ativa e confira a versão instalada. Principais observações de compatibilidade:
- O nível de compatibilidade de PDF
1.7é recomendado para fluxos de trabalho modernos - Assinaturas digitais existentes são invalidadas quando o PDF é reescrito.
- Fluxos de trabalho legados em PostScript continuam com suporte, mas podem exigir atualizações
Conclusão
O Ghostscript pode carimbar todas as páginas de um PDF e aplicar uma predefinição de compressão em um fluxo de trabalho reproduzível. Preserve a entrada, faça a falha ficar visível quando qualquer uma das etapas falhar e inspecione o resultado antes de publicá-lo.
Para processamento automatizado de documentos em grande escala, considere conhecer os serviços de processamento de documentos da Transloadit, que realizam operações com PDFs de forma segura e eficiente na nuvem.
