当前位置: 首页 > article >正文

2025 - 科研神器 - 批量处理 PDF、SVG、PNG 和 JPG 文件,将它们转换为彩色 TIFF 文件,并保存到指定的 tiff 文件夹中

2025 - 科研神器 - 批量处理 PDF、SVG、PNG 和 JPG 文件,将它们转换为彩色 TIFF 文件,并保存到指定的 tiff 文件夹中

'''
Created on 2024-11-22

@author: wangyang(<itwangyang@gmail.comL>)
批量处理 PDF、SVG、PNG 和 JPG 文件,将它们转换为彩色 TIFF 文件,并保存到指定的 tiff 文件夹中。
使用 Ghostscript 和 cairosvg 库进行转换。

使用方法:
1. 打开命令行窗口,切换到脚本所在目录。
2. 输入命令:python 批量处理tiff.py
3. 按照提示输入要处理的目录路径和 DPI 值(默认 300)。
4. 等待脚本处理完毕,所有文件将被转换为彩色 TIFF 文件并保存到 tiff 文件夹中。
5. 脚本会自动删除空的 tiff 文件夹。

注意:
1. 脚本依赖 Ghostscript 和 cairosvg 库,请先安装它们。
2. 脚本仅处理 PDF、SVG、PNG 和 JPG 文件,其他文件将被忽略。
'''

import os
import subprocess
import shutil
from PIL import Image
import cairosvg
import io  # 修复未定义的 io 模块问题


def convert_pdf_to_tiff(pdf_path, tiff_folder, dpi=300):
    """将 PDF 文件转换为彩色 TIFF 文件,并保存到指定的 tiff 文件夹中"""
    try:
        base_name = os.path.splitext(os.path.basename(pdf_path))[0]
        tiff_path = os.path.join(tiff_folder, f"{base_name}.tiff")

        subprocess.run([
            "gs", "-dBATCH", "-dNOPAUSE", "-sDEVICE=tiff24nc",
            f"-r{dpi}", "-sCompression=lzw",
            "-sOutputFile=" + tiff_path, pdf_path
        ], check=True)

        print(f"成功将 PDF {pdf_path} 转换为 {tiff_path}")
    except subprocess.CalledProcessError as e:
        print(f"处理 PDF 文件 {pdf_path} 时出错: {e}")


def convert_svg_to_tiff(svg_path, tiff_folder, dpi=300):
    """将 SVG 文件转换为彩色 TIFF 文件"""
    try:
        base_name = os.path.splitext(os.path.basename(svg_path))[0]
        tiff_path = os.path.join(tiff_folder, f"{base_name}.tiff")

        # 使用 cairosvg 将 SVG 转为 TIFF
        png_data = cairosvg.svg2png(url=svg_path, dpi=dpi)
        with open(tiff_path, "wb") as tiff_file:
            img = Image.open(io.BytesIO(png_data))
            img.save(tiff_file, format="TIFF", dpi=(dpi, dpi))

        print(f"成功将 SVG {svg_path} 转换为 {tiff_path}")
    except Exception as e:
        print(f"处理 SVG 文件 {svg_path} 时出错: {e}")


def convert_image_to_tiff(image_path, tiff_folder, dpi=300):
    """将 PNG 或 JPG 文件转换为彩色 TIFF 文件"""
    try:
        base_name = os.path.splitext(os.path.basename(image_path))[0]
        tiff_path = os.path.join(tiff_folder, f"{base_name}.tiff")

        with Image.open(image_path) as img:
            img.save(tiff_path, format="TIFF", dpi=(dpi, dpi))

        print(f"成功将 {image_path} 转换为 {tiff_path}")
    except Exception as e:
        print(f"处理图像文件 {image_path} 时出错: {e}")


def clean_empty_tiff_folders(input_dir):
    """递归删除空的 TIFF 文件夹"""
    for root, dirs, _ in os.walk(input_dir, topdown=False):
        for dir_name in dirs:
            dir_path = os.path.join(root, dir_name)
            if dir_name == "tiff" and not os.listdir(dir_path):  # 如果 tiff 文件夹为空
                shutil.rmtree(dir_path)
                print(f"删除空文件夹: {dir_path}")


def process_directory_recursive(input_dir, dpi=300):
    """递归处理目录中的 PDF、SVG、PNG 和 JPG 文件"""
    for root, _, files in os.walk(input_dir):
        # 在每个目录中创建 tiff 文件夹
        tiff_folder = os.path.join(root, "tiff")
        tiff_folder_created = False  # 标记是否创建了 tiff 文件夹

        # 遍历文件,处理 PDF、SVG、PNG 和 JPG
        for file in files:
            file_path = os.path.join(root, file)
            if file.lower().endswith((".pdf", ".svg", ".png", ".jpg", ".jpeg")):
                if not tiff_folder_created:
                    os.makedirs(tiff_folder, exist_ok=True)
                    tiff_folder_created = True

                if file.lower().endswith(".pdf"):
                    convert_pdf_to_tiff(file_path, tiff_folder, dpi)
                elif file.lower().endswith(".svg"):
                    convert_svg_to_tiff(file_path, tiff_folder, dpi)
                elif file.lower().endswith((".png", ".jpg", ".jpeg")):
                    convert_image_to_tiff(file_path, tiff_folder, dpi)

    # 清理空的 TIFF 文件夹
    clean_empty_tiff_folders(input_dir)


if __name__ == "__main__":
    # 提示用户输入目录
    input_dir = input("请输入要处理的目录路径: ").strip()
    dpi_input = input("请输入 DPI 值(默认 300): ").strip()

    try:
        dpi = int(dpi_input) if dpi_input else 300
    except ValueError:
        print("无效的 DPI 值,使用默认值 300")
        dpi = 300

    if os.path.isdir(input_dir):
        process_directory_recursive(input_dir, dpi)
        print("所有文件已成功转换为彩色 TIFF 文件!")
    else:
        print(f"路径无效:{input_dir}")



http://www.kler.cn/a/410224.html

相关文章:

  • 什么是 SQL 注入
  • [M最短路] lc743. 网络延迟时间(spfa最短路+单源最短路)
  • 正则表达式灾难:重新认识“KISS原则”的意义
  • php日志系统
  • Linux:自定义Shell
  • 【bug】使用transformers训练二分类任务时,训练损失异常大
  • ARM CCA机密计算安全模型之概述
  • C语言菜鸟入门·关键字·union的用法
  • 【前端】JavaScript作用域与预解析:深入理解问题与解答
  • Python期末复习-系列数据类型
  • 路由缓存后跳转到新路由时,上一路由中的tip信息框不销毁问题解决
  • fingerprint.js的使用
  • 【RAG 项目实战 05】重构:封装代码
  • King‘s IOT :实验室设备及环境物联监控预警系统
  • Flask 创建API接口服务
  • 学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果
  • JDK1.8新增特性
  • Java 面经 - HashMap
  • 深入探索Go语言中的sync.Mutex与sync.RWMutex:原理、应用与实践
  • Git Github Gitlab与Gitee的关系
  • 如何在 Eclipse 中调试ABAP程序
  • 【vim】vim怎么把某一列内容复制到另一列
  • 长短时记忆网络(SLTM):理解与实践
  • 基于web的音乐网站(Java+SpringBoot+Mysql)
  • 用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)
  • 利用Google的OR-Tools解决智能调度问题