随机裁剪 pdf 文件并输出图像

随机裁剪 pdf 文件并输出图像

我在一个文件夹中有许多 pdf 文件。我想要做的就是加载一个 pdf 文件并从中生成 100 个随机裁剪,并将每个裁剪转换为大小为 256x256 的图像。因此,如果我有 100 个 pdf 文件,我将得到 100x100 jpg 图像作为输出,因为我想从文件夹中的 100 个 pdf 文件中获取 100 个裁剪。这个过程可以自动化吗?pdf 文件是来自 CiteSeerX 的科学期刊论文。我提供了样本文件

我还希望随机裁剪聚焦于有文本的地方,而不是只有白色背景的区域。我可以使用一些技巧来实现这一点吗?

答案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(渲染 PDF 的 DPI)和-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

综合起来:从任意数量的 PDF 中裁剪 N 个随机部分

结果对于内联包含来说有点笨重。因此您需要下载crop.shcrop-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


1cropsize ImageMagick 设置了 5 亿像素的硬性限制,这意味着对于一个方形区域,÷ 72 ⋅的值density不得超过 √5 亿像素。

相关内容