Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件

news2025/2/11 15:50:18

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件,”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件”

BiliBili视频链接:

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" />

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细介绍Sd-WebUI提示词的语法规则

AI绘画中最大的门槛就是提示词&#xff0c;对英语水平、文学水平、想象力、灵感等要求较高。不能每次一输入正向提示词&#xff08;positive prompt&#xff09;&#xff0c;就只会写a girl, big eyes, red hair。虽然sd-webui软件可以直接翻译&#xff0c;输入一个子母后会立刻…

对Python中队列三种实现方式的测试

一、结论 本程序模拟比较队列的三种情况&#xff1a; 一、deque当作队列使用&#xff1b; 二、queue当作队列使用&#xff1b; 三、list当作队列使用。 结论&#xff1a; Python队列可以用deque、queue、list实现&#xff0c;其中list极慢、queue较慢&#xf…

【VScode】第三方GPT编程工具-CodeMoss安装教程

一、CodeMoss是什么&#xff1f; CodeMoss是一款集编程、学习和办公于一体的高效工具。它兼容多种主流平台&#xff0c;包括VSCode、IDER、Chrome插件、Web和APP等&#xff0c;支持插件安装&#xff0c;尤其在VSCode和IDER上的表现尤为出色。无论你是编程新手还是资深开发者&a…

Unity中如何修改Sprite的渲染网格

首先打开SpriteEditor 选择Custom OutLine,点击Genrate 则在图片边缘会出现边缘线&#xff0c;调整白色小方块可以调整边缘 调整后&#xff0c;Sprite就会按照调整后的网格渲染了。 如何在UI中使用&#xff1f; 只要在UI的Image组件中选择Use Sprite Mesh 即可 结果&#xff1…

【机器学习】探索机器学习与人工智能:驱动未来创新的关键技术

探索机器学习与人工智能&#xff1a;驱动未来创新的关键技术 前言&#xff1a;人工智能的核心技术深度学习&#xff1a;自然语言处理&#xff08;NLP&#xff09;&#xff1a;计算机视觉&#xff1a; 机器学习与人工智能的驱动创新医疗健康领域金融行业智能制造与工业互联网智慧…

Visual Studio Code(VS Code)配置C/C++环境

一、Visual Studio Code安装 Visual Studio Code&#xff0c;下文中简称为VS Code的详细安装方法请参考VSCode安装教程&#xff08;超详细&#xff09;-CSDN博客 二、MinGW编译器下载与配置 1、MinGW介绍 MinGW(Minimalist GNU for Windows)是一款用于Windows 平台的轻…

Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档

目录 一、接口测试基础概念 1、什么是接口 2、接口的类型 3、什么是接口测试 4、为什么要做接口测试 5、接口测试的实现方式 6、什么是自动化接口测试&#xff1f; 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…

HDR视频技术之十一:HEVCH.265 的 HDR 编码方案

前文我们对 HEVC 的 HDR 编码优化技术做了介绍&#xff0c;侧重编码性能的提升。 本章主要阐述 HEVC 中 HDR/WCG 相关的整体编码方案&#xff0c; 包括不同应用场景下的 HEVC 扩展编码技术。 1 背景 HDR 信号一般意味着使用更多比特&#xff0c;一般的 HDR 信号倾向于使用 10…

ThinkPHP 8开发环境安装

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 1. 安装PHP8 Windows系统用户可以前往https://windows.php.net/downloads/releases/archives/下载PHP 8.0版本&am…

CAN201 Introduction to Networking(计算机网络)Pt.2 传输层

文章目录 3. Transport Layer&#xff08;传输层&#xff09;3.1 Multiplexing and demultiplexing&#xff08;多路复用和多路分解&#xff09;3.2 Connectionless transport&#xff1a;UDP3.3 Principles of reliable data transfer3.4 Pipelined communication3.5 TCP: con…

linux系统上SQLPLUS的重“大”发现

SQL plus版本&#xff1a; [oraclepg-xc2 ~]$ sqlplus -v SQL*Plus: Release 19.0.0.0.0 - Production Version 19.3.0.0.0 操作系统&#xff1a;CentOS Linux 7 (Core) 数据库&#xff1a;Oracle 19c Version 19.3.0.0.0 同样的SQL脚本在windos CMD sqlplus 执行没问题。…

Unity中实现人物残影效果

今天火柴人联盟3公测了&#xff0c;看到一个残影的效果&#xff0c;很有意思&#xff0c;上网查询了一下实现方式&#xff0c; 实现思路&#xff1a; 将角色的网格复制出来&#xff0c;然后放置到新建的物体的MeshFilter组件上&#xff0c;每隔几十毫秒在玩家的位置生成一个&a…

mysql mmm和mha对比

本文简单介绍MySQL的两个high availability方案&#xff0c;MMM和MHA。 MMM MMM(Master-Master replication managerfor Mysql)的基本组成如下&#xff0c; 主节点master1&#xff1a;承载写流量备主节点master2&#xff1a;replicate主节点master1的写流量&#xff0c;在主节…

探秘“香水的 ChatGPT”:AI 开启嗅觉奇幻之旅!

你没有看错&#xff0c;AI也能闻到味道了&#xff01;这是一家名为Osmo公司公布的信息&#xff0c;他们成功创造出了由AI生成的李子味道&#xff0c;快跟着小编一探究竟吧~ 【图片来源于网络&#xff0c;侵删】 Osmo公司的这项技术&#xff0c;通过分析香味的化学成分和人类嗅…

uniapp实现为微信小程序扫一扫的功能

引言 随着微信小程序的快速发展,越来越多的开发者开始关注和学习微信小程序的开发。其中,微信小程序的扫一扫功能是非常常用且实用的功能之一。通过扫描二维码,用户可以获取到相关的信息或者实现特定的功能。 正文 在过去,开发者需要使用微信开发者工具以及相关的开发文档…

网络ip地址改成什么比较好

在数字化时代&#xff0c;网络IP地址作为设备在网络中的唯一标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;随着网络环境的日益复杂和网络安全问题的频发&#xff0c;许多用户开始考虑更改自己的网络IP地址&#xff0c;以期获得更好的网络体验和安全保障。那么&#…

iOS从Matter的设备认证证书中获取VID和PID

设备认证证书也叫 DAC, 相当于每个已经认证的设备的标识。包含了 VID 和 PID. VID: Vendor ID &#xff0c;标识厂商 PID: Product ID&#xff0c; 标识设备的 根据 Matter 对于设备证书的规定&#xff0c;DAC证书subject应该包含VID 和 PID. 可通过解析 X509 证书读取subject…

聊一聊 C#线程池 的线程动态注入

提高注入速度的两种方法 1. 降低GateThread的延迟时间 上一篇跟大家聊过 Result 默认情况下GateThread每秒会注入4个&#xff0c;底层逻辑是由 Blocking.MaxDelayMs250ms 变量控制的&#xff0c;言外之意就是能不能减少这个变量的值呢&#xff1f;当然可以的&#xff0c;这里我…

【嵌入式C语言】指针数组结构体

指针与数组 指针与数组指针数组数组指针 多维数组数组名的保存 结构体定义结构体定义结构体变量使用typedef简化结构体声明访问结构体成员结构体内存分配字节对齐位域定义位域位域的限制示例 指针与数组 指针数组和数组指针是两个不同的概念&#xff0c;它们涉及到指针和数组的…

HarmonyOS NEXT 实战之元服务:静态案例效果(二)

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图代码案例如下&#xff1a; Index里面实现 import { authent…