Você precisará do Ghostscript, dos utilitários do Poppler e do ImageMagick:
sudo apt install ghostscript poppler-utils imagemagick
Vamos passar por isso passo a passo (porque eu preciso passar por esse processo mental).
Extrair uma página aleatória de um PDF
pagecount=$(pdfinfo in.pdf | sed -ne 's/^Pages:\s*//p')
page=$(($RANDOM % $pagecount + 1))
gs -q -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -sDEVICE=pdfwrite \
-dFirstPage="$page" -dLastPage="$page" -sOutputFile="in.$page.pdf" -f in.pdf
Cortar uma seção predefinida da mesma página
gs -q -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -sDEVICE=pdfwrite \
-c "[/CropBox [50 50 250 250] /PAGES pdfmark" \
-sOutputFile=out.pdf -f "in.$page.pdf"
Cortar uma seção aleatória da mesma página
Selecione um valor decimal para cropsize
(em pontos , 1 ponto = 1/72 polegada) que é menor que a largura e a altura.
cropsize=50
bbox=$(gs -q -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -sDEVICE=bbox -f "in.$page.pdf" 2>&1 >&- | sed -ne 's/^%%HiResBoundingBox:\s*//p')
cropbbox=$(python3 - "$cropsize" "$bbox" <<EOF
import sys, random
cropsize = float(sys.argv[1])
llx, lly, urx, ury = map(float, sys.argv[2].split(None, 3))
width = urx - llx
height = ury - lly
if width < cropsize or height < cropsize:
print('Crop size too small for bounds', llx, lly, urx, ury, file=sys.stderr)
sys.exit(1)
cropllx = random.uniform(0, width - cropsize) + llx
croplly = random.uniform(0, height - cropsize) + lly
cropurx = cropllx + cropsize
cropury = croplly + cropsize
print(*map(lambda x: format(x, '.6f'), (cropllx, croplly, cropurx, cropury)))
EOF
)
gs -q -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -sDEVICE=pdfwrite \
-c "[/CropBox [$cropbbox] /PAGES pdfmark" \
-sOutputFile=cropped.pdf -f "in.$page.pdf"
Converter um PDF recortado para JPEG
Ajuste size
, -density
(DPI para renderizar o PDF) e -quality
(qualidade de compactação JPEG) de acordo com suas necessidades.
size=256
convert -define pdf:use-cropbox=true -colorspace sRGB -density 600 cropped.pdf \
-flatten -resize "${size}x${size}^" -crop "${size}x${size}+0+0!" -quality 75% cropped.jpg
Juntando tudo: corte N seções aleatórias de uma quantidade arbitrária de PDFs
O resultado é um pouco pesado para inclusão em linha. Portanto, você precisa fazer o download de crop.sh
e crop-calc.py
da minha essência no mesmo diretório.
Uso:
bash /path/to/crop.sh [OPTIONS...] <N> <PDF...>
com:
-
N
- a contagem de áreas aleatórias para extrair por documento -
PDF...
- qualquer número de arquivos PDF -
-s|--size PX
- tamanho das imagens resultantes em pixels (padrão 256) -
-c|--cropsize PT
- tamanho das regiões do documento para recortar pontos (padrão 50) -
-d|--density DPI
- densidade de pixels ao renderizar o documento (padrão 600) 1 -
-q|--quality Q
- qualidade de compactação da imagem resultante, geralmente em porcentagem (padrão 75%) -
--destext EXT
- a extensão do arquivo (e formato) das imagens resultantes (padrãojpg
)
1 O ImageMagick define um limite rígido de 500 mio. pixels, o que significa que para uma área quadrada o valor de cropsize
÷ 72 ⋅ density
não pode exceder √500 mio.