Произвольно обрезать PDF-файлы и выводить изображение

У меня есть много файлов PDF в папке. Все, что я хочу сделать, это загрузить файл PDF и сгенерировать 100 случайных культур из него и преобразовать каждую культуру в изображение размером 256x256. Поэтому, если у меня есть 100 файлов PDF, у меня будет 100x100 изображений в формате JPG, так как я хочу получить 100 урожаев из 100 файлов PDF в папке. Может ли этот процесс быть автоматизирован? PDF-файлы представляют собой научные журнальные статьи от CiteSeerX. Я предоставил образец документа .

Я также хотел бы, чтобы случайный урожай фокусировался на местах, где есть тексты, а не на областях с белым фоном. Могу ли я применить это, используя некоторые методы?

4
задан 5 July 2017 в 20:12

1 ответ

Вам будут нужны Ghostscript, утилиты Poppler и ImageMagick:

sudo apt install ghostscript poppler-utils imagemagick

Давайте пройдем это шаг за шагом (потому что я должен пройти эту умственную деятельность сам).

Извлеките случайную страницу из 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

Обрежьте предопределенный раздел от той же страницы

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"

Преобразуйте обрезанный PDF в JPEG

Корректироваться 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

Соединение всего этого: Обрежьте случайные разделы N от произвольной суммы PDFs

Результат является немного громоздким для встроенного включения. Поэтому необходимо загрузить 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.

3
ответ дан 1 December 2019 в 10:00

Другие вопросы по тегам:

Похожие вопросы: