Linux shell脚本对常见图片格式批量转换为PDF文件

 更新时间:2024年12月26日 10:09:43   作者:星如雨落  
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的资料请关注脚本之家其它相关文章!

相关文章

  • 非常简单的Shell菜单脚本

    非常简单的Shell菜单脚本

    这篇文章主要为大家详细介绍了非常简单的Shell菜单脚本,傻瓜式的人机交互,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • shell在指定目录下批量执行sql脚本的实例

    shell在指定目录下批量执行sql脚本的实例

    今天小编就为大家分享一篇shell在指定目录下批量执行sql脚本的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • linux查看已使用内存的常用命令

    linux查看已使用内存的常用命令

    在Linux系统中,我们可以使用多个命令来查看内存使用情况,其中比较常用的命令有free、top、ps和sar,使用free命令可以查看系统内存的使用情况,这些命令可以帮助我们快速了解系统内存的使用情况,从而更好地进行内存管理和优化,需要的朋友可以参考下
    2024-01-01
  • Linux shell中的printf的详细用法

    Linux shell中的printf的详细用法

    这篇文章主要介绍了Linux shell中的printf的详细用法的相关资料,希望能通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • 每天一个linux命令 chgrp命令

    每天一个linux命令 chgrp命令

    这篇文章主要为大家详细介绍了一个linux命令:chgrp命令,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • win10下如何运行.sh文件的实现步骤

    win10下如何运行.sh文件的实现步骤

    这篇文章主要介绍了win10下如何运行.sh文件的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Shell中的数学运算使用

    Shell中的数学运算使用

    这篇文章主要介绍了Shell中的数学运算使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 如何写出安全的、基本功能完善的Bash脚本

    如何写出安全的、基本功能完善的Bash脚本

    这篇文章主要介绍了如何写出安全的、基本功能完善的Bash脚本,帮助大家更好的理解和使用bash shell,感兴趣的朋友可以了解下
    2020-12-12
  • Linux使用cal命令查看日历的实用技巧分享

    Linux使用cal命令查看日历的实用技巧分享

    在 Linux 系统中,cal 命令是一个简单却非常实用的小工具,专门用于显示日历信息,无论是查看当前月份的日历、特定年份的日历,还是进行日期计算,cal 命令都能轻松应对,本文将深入探讨 cal 命令的功能,从基础用法到高级技巧,需要的朋友可以参考下
    2026-02-02
  • Shell位置变量&预定义变量的实现

    Shell位置变量&预定义变量的实现

    Shell位置变量和预定义变量是Shell脚本编程中非常重要的概念,本文主要介绍了Shell位置变量&预定义变量的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论