Linux shell脚本对常见图片格式批量转换为PDF文件
作者:星如雨落
Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件,”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件”,本文详细介绍了Linux shell脚本对常见图片格式批量转换为PDF文件的操作
在Linux系统中,使用ImageMagick可以图片格式转换,其中最常用的是通过命令行工具进行。
ImageMagick是一个非常强大的图像处理工具集,它包含了许多用于图像转换的命令。
sudo apt-get install imagemagick # 对于基于Debian的系统
验证是否安装成功: 尝试运行ImageMagick提供的一些常用命令,比如:
convert --version
如果convert命令可用,它将返回版本信息。
一、可以编写shell脚本批量转换图片为PDF文件
shell脚本文件名: pictures_to_pdf_v1.0.sh
#!/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脚本文件执行权限
chmod +x pictures_to_pdf_v1.0.sh
3.运行shell脚本,"请在运行脚本名称后面,输入转换参数'1':(多个图片分开生成多个PDF文件)或 参数'2':(多个图片合并生成一个PDF文件)"
./pictures_to_pdf_v1.0.sh "转换参数"
测试效果如下:
4.在生成的output-images
目录中,会看到生成的PDF文件。
三、该Shell脚本下载地址
gitee链接: https://gitee.com/datutu2015/pictures_to_pdf 蓝奏云链接: https://wwxc.lanzouo.com/io1tg2iv6rpa 知识星球链接: https://t.zsxq.com/1Yjs8
四、报错处理
如果在图片转换pdf中,出现下面报错:
(‘PDFpng error‘, b“convert-im6.q16: attempt to perform an operation not allowed by the security poli
这个错误信息表明在执行将图片转换为PDF文件的命令时出现了问题,具体错误与安全策略不允许执行"PDF"操作有关。
需要修改这个安全策略policy.xml
文件,打开命令终端,执行下面命令:
sudo vim /etc/ImageMagick-6/policy.xml
在找到的行中,将 rights 属性的值设置为 “read|write”,以允许读取和写入PDF文件。例如,将行修改为类似下面的形式:
<policy domain="coder" rights="read|write" pattern="PDF" />
以上就是Linux shell脚本对常见图片格式批量转换为PDF文件的详细内容,更多关于Linux shell脚本图片格式转PDF的资料请关注脚本之家其它相关文章!