Arraste aleatoriamente arquivos pdf e imagem de saída

4

Eu tenho muitos arquivos pdf em uma pasta. Tudo o que quero fazer é carregar um arquivo pdf e gerar 100 colheitas aleatórias a partir dele e converter cada cultura em imagens de tamanho 256x256. Então, se eu tiver 100 arquivos pdf, terei 100x100 imagens jpg como saída, pois quero obter 100 culturas de 100 arquivos PDF dentro de uma pasta. Esse processo pode ser automatizado? Os arquivos pdf são artigos de periódicos científicos da CiteSeerX. Eu forneci um exemplo de documento .

Eu também gostaria que a safra aleatória se concentrasse nos lugares que possuem textos e não nas regiões com apenas fundo branco. Posso impor isso usando algumas técnicas?

    
por Dharma 05.07.2017 / 11:05

1 resposta

3

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ão jpg )

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.

    
por David Foerster 06.07.2017 / 01:00