百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Python 实现 批量 复制指定PDF文件 到指定文件夹并批量打印出来

bigegpt 2024-08-31 16:39 5 浏览

首先从我的工作特点出发,介绍如果通过编程实现繁琐的工作简单化。

我在一家进口食品供应链企业工作,我的工作内容常常涉及到PDF文件的打印,比如:报关单,上回我分享了两篇文章,关于 EXCEL - VBA代码的实现批量打印PDF打印文件的文章:1、EXCE-VBA-批量打印单元格内指定文件名的文件;2、批量打印PDF文件 Excel VBA;今天还是围绕打印PDF文件的,不过这次是用 Python代码实现。

Python和Pycharm的安装我这里就直接跳过,搜索一下有很多教程的,Pycharm用免费版就可以了。

首先,实现方式完全是按照自己的想法来的,每个公司都自己的系统或者表格记录着公司的重要信息,然而我们通过系统或者表格筛选出需要的数据后,通过复制相关信息后运行python程序后,程序会根据所复制的内容,在指定的文件夹内检索相关PDF文件,进行PDF文件的复制和打印。

我们用到的库有以下,安装方法可以通过Win+R,运行:CMA,输入pip install 库名安装;或者 通过Pycharm的的文件-设置-python解释器+ 搜索安装,搜索一下有很多教程的;

import os
import shutil
from tkinter import *
from tkinter import filedialog
import glob
import pyperclip
import win32api,win32con,win32print

定义def函数:

1、用于存放复制过来的PDF文件,这个文件夹我叫它“需打印的报关单”(我的电脑桌面路径是:C:\Users\Administrator\Desktop),主要功能就是判断一下这个文件夹是否存在,不存在就直接创建,已存在的话弹出提示框;

def mkdir():  # 文件夹是否存在处理过程
    isExists = os.path.exists("C:\\Users\\Administrator\\Desktop\\需打印的报关单")  # 判断路径是否存在  # 存在True  # 不存在False
    if not isExists:  # 判断
        os.makedirs("C:\\Users\\Administrator\\Desktop\\需打印的报关单")  # 不存在创建文件夹
        return True
    else:   #存在就弹出提示框
        win32api.MessageBox(0, "帅哥美女:桌面已经有所需的文件夹了,文件夹内可能有之前的文件,请妥善处理后再点击 确认 。", "小叶提醒", win32con.MB_ICONASTERISK)

2、定义打印PDF文件指令,自动选择 电脑默认打印机;

def print_file(print_file):    #定义打印PDF文件指令,自动选择 电脑默认打印机
    open(print_file,"r")
    win32api.ShellExecute(
        0,
        "print",
        print_file,
        '/d:"%s"' % win32print.GetDefaultPrinter(),
        ".",
        0
    )

3、程序入口,已标注得非常清楚,这里就不再扒拉巴拉了;

if __name__ == '__main__':
    a = 0   #定义一个变量,赋值为0,这个变量用于统计打印报关单的份数
    mkdir()   #调用函数 def mkdir(): 文件夹是否存在处理过程
    path0 = "C:\\Users\\Administrator\\Desktop\\需打印的报关单\\"   #定义一个变量,将创建的文件夹路径赋值给它
    path2 = pyperclip.paste() #定义一个变量,存放获取的剪切板数据
    filelist0 = path2.split("\r\n")  #定义一个变量,存放列表化的剪切板数据
    if not path2:   #剪切板为空的时候弹出提示框
        win32api.MessageBox(0, "帅哥美女:没有复制到柜号 或者 复制了其他无关内容,请重新到Excel表格复制柜号。", "小叶提醒QQ308699402", win32con.MB_ICONASTERISK)
    root = Tk()  #创建一个窗体,通过这个窗口选择指定的目标文件夹,目标文件夹存放着很多PDF文件,我们要通过这个程序在这个文件夹中筛选出需要的文件
    root.withdraw()  # 隐藏主窗口
    path1 = filedialog.askdirectory()  #定义一个变量,存放存放目标文件夹内容
    filelist1 = os.listdir(path1)   #定义一个变量,存放文件内容列表化数据
    for aa in filelist0:   #将列表化的剪切板数据一个一个的循环赋值给 aa
        for bb in filelist1:   #将文件内容列表化数据一个一个的循环赋值给 bb
            bb1 = bb[0:7]      #过滤文件名
            bb2 = bb[3:10]     #过滤文件名
            bb3 = bb[-13:-6]   #过滤文件名
            bb4 = bb[-14:-7]   #过滤文件名
            if bb1 == aa or bb2 == aa or bb3 == aa or bb4 == aa:  #判断过滤后的文件名与剪切板数据是否一致,直到全部剪切板数据比对完成 aa
                for cc in glob.glob(path1 +"/*" + aa + "*关*.pdf"):  #循环选取一致的文件
                    shutil.copy(cc,path0)  #复制PDF文件到需打印的报关单文件夹
    win32api.MessageBox(    #批次量打印前的一次重要提醒,点击 确认 便开始打印复制好的PDF文件
        0,
        "帅哥美女:\n"
        "电脑自动选择默认打印机\n"
        "请检查打印机里面的纸张是否全部都是白纸,白纸是否足够\n"
        "点击 确定 后开始打印文件夹内的报关单", "小叶提醒QQ308699402", win32con.MB_ICONASTERISK)
    desktop_path = "C:\\Users\\Administrator\\Desktop\\"  #定义一个变量,赋值一个路径,用于存放打印结果
    full_path = desktop_path + '已打印的报关单详细清单.txt'  # 创建一个txt文件,也可以创建一个.doc的word文档
    file = open(full_path, 'w')      #打开txt文档,写入数据
    file.write("已打印的报关单有:\n")
    for i in os.listdir(path0):    #循环打印报关单,直到 文件夹需打印的报关单里的全部文件加载到打印
        file_path = os.path.join(path0, i)
        print_file(file_path)  #调用打印PDF文件指令函数
        a += 1  #打印计数
        file.write(str(i) + "\n")   #已打印的文件名
    file.write("一共打印了" + str(a) + "份报关单,请等待打印机完成全部打印!!!")
    file.close()  #写入关闭

大功告成,运行一下吧!

注意:

1、电脑必须安装Adobe的PDF阅读器,并且将Adobe的PDF阅读器必须设为置为PDF文件的默认打开方式,否则程序会报错(error: (31, 'ShellExecute', '连到系统上的设备没有发挥作用。'))

2、运行前先复制好数据;

3、相关图片

相关推荐

Java 泛型大揭秘:类型参数、通配符与最佳实践

引言在编程世界中,代码的可重用性和可维护性是至关重要的。为了实现这些目标,Java5引入了一种名为泛型(Generics)的强大功能。本文将详细介绍Java泛型的概念、优势和局限性,以及如何在...

K8s 的标签与选择器:流畅运维的秘诀

在Kubernetes的世界里,**标签(Label)和选择器(Selector)**并不是最炫酷的技术,但却是贯穿整个集群管理与运维流程的核心机制。正是它们让复杂的资源调度、查询、自动化运维变得...

哈希Hash算法:原理、应用(哈希算法 知乎)

原作者:Linux教程,原文地址:「链接」什么是哈希算法?哈希算法(HashAlgorithm),又称为散列算法或杂凑算法,是一种将任意长度的数据输入转换为固定长度输出值的数学函数。其输出结果通常被...

C#学习:基于LLM的简历评估程序(c# 简历)

前言在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子,感觉还挺好玩的,为了练习一下C#,我最近使用C#重写了一个。准备不同的简历:image-20250528183949844查...

55顺位,砍41+14+3!季后赛也成得分王,难道他也是一名球星?

雷霆队最不可思议的新星:一个55号秀的疯狂逆袭!你是不是也觉得NBA最底层的55号秀,就只能当饮水机管理员?今年的55号秀阿龙·威金斯恐怕要打破你的认知了!常规赛阶段,这位二轮秀就像开了窍的天才,直接...

5分钟读懂C#字典对象(c# 字典获取值)

什么是字典对象在C#中,使用Dictionary类来管理由键值对组成的集合,这类集合被称为字典。字典最大的特点就是能够根据键来快速查找集合中的值,其键的定义不能重复,具有唯一性,相当于数组索引值,字典...

c#窗体传值(c# 跨窗体传递数据)

在WinForm编程中我们经常需要进行俩个窗体间的传值。下面我给出了两种方法,来实现传值一、在输入数据的界面中定义一个属性,供接受数据的窗体使用1、子窗体usingSystem;usingSyst...

C#入门篇章—委托(c#委托的理解)

C#委托1.委托的定义和使用委托的作用:如果要把方法作为函数来进行传递的话,就要用到委托。委托是一个类型,这个类型可以赋值一个方法的引用。C#的委托通过delegate关键字来声明。声明委托的...

C#.NET in、out、ref详解(c#.net framework)

简介在C#中,in、ref和out是用于修改方法参数传递方式的关键字,它们决定了参数是按值传递还是按引用传递,以及参数是否必须在传递前初始化。基本语义对比修饰符传递方式可读写性必须初始化调用...

C#广义表(广义表headtail)

在C#中,广义表(GeneralizedList)是一种特殊的数据结构,它是线性表的推广。广义表可以包含单个元素(称为原子),也可以包含另一个广义表(称为子表)。以下是一个简单的C#广义表示例代...

「C#.NET 拾遗补漏」04:你必须知道的反射

阅读本文大概需要3分钟。通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员Type类的GetMembe...

C#启动外部程序的问题(c#怎么启动)

IT&OT的深度融合是智能制造的基石。本公众号将聚焦于PLC编程与上位机开发。除理论知识外,也会结合我们团队在开发过程中遇到的具体问题介绍一些项目经验。在使用C#开发上位机时,有时会需要启动外部的一些...

全网最狠C#面试拷问:这20道题没答出来,别说你懂.NET!

在竞争激烈的C#开发岗位求职过程中,面试是必经的一道关卡。而一场高质量的面试,不仅能筛选出真正掌握C#和.NET技术精髓的人才,也能让求职者对自身技术水平有更清晰的认知。今天,就为大家精心准备了20道...

C#匿名方法(c#匿名方法与匿名类)

C#中的匿名方法是一种没有名称只有主体的方法,它提供了一种传递代码块作为委托参数的技术。以下是关于C#匿名方法的一些重要特点和用法:特点省略参数列表:使用匿名方法可省略参数列表,这意味着匿名方法...

C# Windows窗体(.Net Framework)知识总结

Windows窗体可大致分为Form窗体和MDI窗体,Form窗体没什么好细说的,知识点总结都在思维导图里面了,下文将围绕MDI窗体来讲述。MDI(MultipleDocumentInterfac...