Случайно обрезать файлы PDF и выводить изображение

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

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

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

3 ответа

Вам понадобятся 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"

Обрезать случайный раздел с той же страницы [!d4 ]

Выберите десятичное значение для 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 [ ! d7]

Настройте 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 случайных секций из произвольного количества PDF-файлов

Результат немного громоздкий для включения строки. Поэтому вам нужно загрузить 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 миллионов. пикселей, что означает квадратную площадь, значение cropsize ÷ 72 ⋅ density не может превышать √500 млн.

3
ответ дан 22 May 2018 в 20:51
  • 1
    Прекрасно работает. Огромное спасибо. Для максимального качества - сколько dpi можно настроить для Дэвида? – Dharma 6 July 2017 в 06:33
  • 2
    @Dharma: Смотрите ноту – David Foerster 6 July 2017 в 10:32

Вам понадобятся 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 [ ! d7]

Настройте 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 случайных секций из произвольного количества PDF-файлов

Результат немного громоздкий для включения строки. Поэтому вам нужно загрузить 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 миллионов. пикселей, что означает квадратную площадь, значение cropsize ÷ 72 ⋅ density не может превышать √500 млн.

3
ответ дан 18 July 2018 в 10:42

Вам понадобятся 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 [ ! d7]

Настройте 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 случайных секций из произвольного количества PDF-файлов

Результат немного громоздкий для включения строки. Поэтому вам нужно загрузить 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 миллионов. пикселей, что означает квадратную площадь, значение cropsize ÷ 72 ⋅ density не может превышать √500 млн.

3
ответ дан 24 July 2018 в 19:37

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

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