У меня есть много файлов PDF в папке. Все, что я хочу сделать, это загрузить файл PDF и сгенерировать 100 случайных культур из него и преобразовать каждую культуру в изображение размером 256x256. Поэтому, если у меня есть 100 файлов PDF, у меня будет 100x100 изображений в формате JPG, так как я хочу получить 100 урожаев из 100 файлов PDF в папке. Может ли этот процесс быть автоматизирован? PDF-файлы представляют собой научные журнальные статьи от CiteSeerX. Я предоставил образец документа .
Я также хотел бы, чтобы случайный урожай фокусировался на местах, где есть тексты, а не на областях с белым фоном. Могу ли я применить это, используя некоторые методы?
Вам будут нужны Ghostscript, утилиты Poppler и ImageMagick:
sudo apt install ghostscript poppler-utils imagemagick
Давайте пройдем это шаг за шагом (потому что я должен пройти эту умственную деятельность сам).
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
gs -q -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -sDEVICE=pdfwrite \
-c "[/CropBox [50 50 250 250] /PAGES pdfmark" \
-sOutputFile=out.pdf -f "in.$page.pdf"
Выберите десятичное значение для cropsize
(в точках, 1 точка = 1/72 дюйма), который является меньше и, чем ширина и, чем высота.
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"
Корректироваться size
, -density
(DPI для рендеринга PDF), и -quality
(Качество сжатия JPEG) к Вашим потребностям.
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
Результат является немного громоздким для встроенного включения. Поэтому необходимо загрузить crop.sh
и crop-calc.py
от моей Сути в тот же каталог.
Использование:
bash /path/to/crop.sh [OPTIONS...] <N> <PDF...>
с:
N
– количество случайных областей для извлечения на документ
PDF...
– любое количество файлов PDF
-s|--size PX
– размер получающихся изображений в пикселях (значение по умолчанию 256)
-c|--cropsize PT
– размер регионов документа для обрезки в точках (значение по умолчанию 50)
-d|--density DPI
– плотность пикселей при рендеринге документа (значение по умолчанию 600) 1
-q|--quality Q
– качество сжатия получающегося изображения, обычно в проценте (значение по умолчанию 75%)
--destext EXT
– расширение файла (и формат) получающихся изображений (значение по умолчанию jpg
)
1 ImageMagick устанавливает жесткий предел 500 пикселей mio, что означает для области квадрата значение cropsize
÷ 72 ⋅ density
может не превысить √500 mio.