
Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件,”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件”
BiliBili视频链接: Linux shell脚本对常见图片格式批量转换为PDF文件
在Linux系统中,使用ImageMagick可以图片格式转换,其中最常用的是通过命令行工具进行。
ImageMagick是一个非常强大的图像处理工具集,它包含了许多用于图像转换的命令。
1 2 |
sudo apt-get install imagemagick # 对于基于Debian的系统 |
验证是否安装成功:
尝试运行ImageMagick提供的一些常用命令,比如:
1 2 |
convert --version |
如果convert命令可用,它将返回版本信息。
二、可以编写shell脚本批量转换图片为PDF文件
shell脚本文件名:
pictures_to_pdf_v1.0.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
#!/bin/bash #脚本功能:把常用的图片格式(png、jpg、jpeg、webp、tiff)批量转换为PDF格式, # “多个图片分开生成多个PDF文件”或者“多个图片合并生成一个PDF文件” #函数功能:使用了*通配符来检查字符串中是否有空格。如果字符串包含空格,contains_space函数将返回真(true),否则返回假(false)。 function contains_space() { [[ $1 = *\ * ]] } #函数功能:把空格全部替换为'_'下划线" function space2underline(){ local file_name_old=$1 # 使用contains_space函数判断文件名中是否含有空格 if contains_space "$file_name_old"; then file_name_new="${file_name_old// /_}" mv "$file_name_old" "$file_name_new"; echo "$file_name_new" else echo "$file_name_old" fi } # 多个图片分开生成多个PDF文件 function images_to_multiple_pdf(){ # 获取第一个参数 local new_folder=$1 #for file_name in `ls *.png *.jpg *.jpeg *.webp *.tiff`;do for file_name in *;do #echo "文件'${file_name}'" if [ "png" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" (convert $file_name `echo ../$new_folder/${file_name//.png/.pdf}`) && (echo "${file_name}已成功转为pdf格式") || (echo "${file_name}转换失败") elif [ "jpg" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" (convert $file_name `echo ../$new_folder/${file_name//.jpg/.pdf}`) && (echo "${file_name}已成功转为pdf格式") || (echo "${file_name}转换失败") elif [ "jpeg" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" (convert $file_name `echo ../$new_folder/${file_name//.jpeg/.pdf}`) && (echo "${file_name}已成功转为pdf格式") || (echo "${file_name}转换失败") elif [ "webp" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" (convert $file_name `echo ../$new_folder/${file_name//.webp/.pdf}`) && (echo "${file_name}已成功转为pdf格式") || (echo "${file_name}转换失败") elif [ "tiff" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" (convert $file_name `echo ../$new_folder/${file_name//.tiff/.pdf}`) && (echo "${file_name}已成功转为pdf格式") || (echo "${file_name}转换失败") #else #echo "仅支持常见的图片格式(png、jpg、jpeg、webp、tiff)才可以转换为PDF格式,其他文件'${file_name}'不支持!" fi done } # 多个图片合并生成一个PDF文件 function images_to_single_pdf(){ # 获取第一个参数 local new_folder=$1 # 图片名称字符串,例如"1.png 2.jpg" local file_names="" #for file_name in `ls *.png *.jpg *.jpeg *.webp *.tiff`;do for file_name in *;do #echo "文件'${file_name}'" if [ "png" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" file_names+=" "$file_name #echo "'${file_names}'" elif [ "jpg" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" file_names+=" "$file_name #echo "'${file_names}'" elif [ "jpeg" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" file_names+=" "$file_name #echo "'${file_names}'" elif [ "webp" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" file_names+=" "$file_name #echo "'${file_names}'" elif [ "tiff" == "${file_name##*.}" ];then file_name=$(space2underline "$file_name") #echo "$file_name" file_names+=" "$file_name #echo "'${file_names}'" #else #echo "仅支持常见的图片格式(png、jpg、jpeg、webp、tiff)才可以转换为PDF格式,其他文件'${file_name}'不支持!" fi done # 删除file_names字符串最前面的空格 file_names=${file_names#"${file_names%%[![:space:]]*}"} echo "'${file_names}'" # 多个图片转换为一个pdf (convert $file_names `echo ../$new_folder/output.pdf`) && (echo "'${file_names}'已成功转为pdf格式") || (echo "'${file_names}'转换失败") } #--------------------------------------------------------------------------------- #函数功能:主函数 #--------------------------------------------------------------------------------- function main(){ echo "温馨提示:仅支持常见的图片格式(png、jpg、jpeg、webp、tiff)才可以转换为PDF格式,其他文件类型不支持!" # 创建新文件夹 new_folder="output-images" # 检查文件夹是否存在 if [ ! -d "$new_folder" ]; then # 文件夹不存在,创建文件夹 mkdir "$new_folder" fi # 存放待转换的图片文件夹 input_images_folder="input-images" # 检查文件夹是否存在 if [ ! -d "$input_images_folder" ]; then # 文件夹不存在,创建文件夹 mkdir "$input_images_folder" fi # 进入input-images目录 cd "$input_images_folder" # 判断$1参数是否为空,不为空设置input_number if [ -z $1 ];then # echo "第一个参数为空" # 获取当前脚本名称 local script_name=$(basename "$0") echo "请在运行脚本'${script_name}'名称后面,输入参数'1':(多个图片分开生成多个PDF文件)或 参数'2':(多个图片合并生成一个PDF文件)" exit else # echo "第一个参数不为空,值为:$1" local input_number=$1 fi if [ "1" == "$input_number" ];then # 多个图片分开生成多个PDF文件 images_to_multiple_pdf "$new_folder" elif [ "2" == "$input_number" ];then # 多个图片合并生成一个PDF文件 images_to_single_pdf "$new_folder" else # 获取当前脚本名称 local script_name=$(basename "$0") echo "请在运行脚本'${script_name}'名称后面,输入参数'1':(多个图片分开生成多个PDF文件)或 参数'2':(多个图片合并生成一个PDF文件)" exit fi # 进入上一级目录 cd .. } # ---------------执行主函数------------------- main $1 |
三、使用方法
1.首先把图片放到input-images
目录下。
2.赋予shell脚本文件执行权限
1 2 |
chmod +x pictures_to_pdf_v1.0.sh |
3.运行shell脚本,”请在运行脚本名称后面,输入转换参数’1′:(多个图片分开生成多个PDF文件)或 参数’2′:(多个图片合并生成一个PDF文件)”
1 2 |
./pictures_to_pdf_v1.0.sh "转换参数" |
测试效果如下:
4.在生成的output-images
目录中,会看到生成的PDF文件。
四、该Shell脚本下载地址
1 2 3 4 5 6 7 8 9 |
gitee链接: https://gitee.com/datutu2015/pictures_to_pdf 蓝奏云链接: https://wwxc.lanzouo.com/io1tg2iv6rpa 知识星球链接: https://t.zsxq.com/1Yjs8 |
五、报错处理
如果在图片转换pdf中,出现下面报错:
1 2 |
(‘PDFpng error‘, b“convert-im6.q16: attempt to perform an operation not allowed by the security poli |
这个错误信息表明在执行将图片转换为PDF文件的命令时出现了问题,具体错误与安全策略不允许执行”PDF”操作有关。
需要修改这个安全策略policy.xml
文件,打开命令终端,执行下面命令:
1 2 |
sudo vim /etc/ImageMagick-6/policy.xml |
在找到的行中,将 rights 属性的值设置为 “read|write”,以允许读取和写入PDF文件。例如,将行修改为类似下面的形式:
1 2 |
<policy domain="coder" rights="read|write" pattern="PDF" /> |