![随机裁剪 pdf 文件并输出图像](https://linux22.com/image/1060461/%E9%9A%8F%E6%9C%BA%E8%A3%81%E5%89%AA%20pdf%20%E6%96%87%E4%BB%B6%E5%B9%B6%E8%BE%93%E5%87%BA%E5%9B%BE%E5%83%8F.png)
我在一个文件夹中有许多 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.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
)
1cropsize
ImageMagick 设置了 5 亿像素的硬性限制,这意味着对于一个方形区域,÷ 72 ⋅的值density
不得超过 √5 亿像素。