由于现在很多工作需要将图片转为pdf格式,但单位的电脑系统太老了,装不了pillow库(谁让我只会Python呢),只能退而求其次,充分发挥家里那块上了灰尘的树莓派了,原来已经装好系统了,现在只要安装pillow库,然后用Python编写个自动检测U盘并读取特定文件夹的图片并用pillow转换成pdf格式后存入U盘另一个特定文件夹,最后写个bash脚本放到开机启动项里边就好了。估计用到的Python库有psutil,shutil,os,time,pillow。ssh上树莓派(同一个局域网可以用nmap 192.168.0.* 扫描树莓派的IP,不确定网段的可以先用ifconfig查看网段), 经查除了psutil没有外其他的都有了,令人惊讶的是pillow库居然也安装了(其实linux系统都预装了该库)。用pip3 install psutil 安装,(平时不怎么用,懒得改python2.7了,直接用pip3吧,到时候也直接用python3)
先在有屏幕的电脑上编辑好.py程序。(vim编辑的话估计会很痛苦吧)
放上树莓派,开机自动转换成功,可重复插拔。
又想增加一个LED灯来提示运行状态,用到RPi.GPIO,树莓派本身就装有了。
全部代码如下,小白水平,不喜勿喷,欢迎点评。
```
from os import path,mkdir,system,listdir
from time import sleep
from PIL import Image
from psutil import disk_partitions
import RPi.GPIO as GPIO
#####################################################
for firstitem in disk_partitions(): #'检测并返回原来电脑盘数'
if firstitem.device=='/dev/sdb1' or firstitem.device=='/dev/sda1': #‘排除开机时U盘就插在电脑上’
firstnum=len(disk_partitions())-1
break
else:
firstnum=len(disk_partitions())
num=firstnum
disk_upan=''
directory1=''
directory2=''
######################################################
def finddevice(): #‘返回u盘路径’
global firstnum,num
global disk_upan
for item in disk_partitions():
disk_list=[]
mount_list=[]
disk_list.append(item.device)
mount_list.append(item.mountpoint)
if '/dev/sdb1' in disk_list or '/dev/sda1' in disk_list:
disk_upan=mount_list[-1] #‘一般挂载在最后一个位置‘
firstnum+=1 #'u盘没拔的话,下次就不用遍历这个函数了’
else:
disk_upan=""
firstnum-=1 #‘u盘拔了的话,下次就不用遍历这个函数了’
##################################################################
def rwdirectorys(directorys):
#'查看是否存在images-xu这个文件夹,如果不存在的话什么都不做'
global directory1
global directory2
directory1=path.join(directorys,'images-xu')
directory2=path.join(directorys,'pdf-xu')
if path.exists(directory1) and path.isdir(directory1):
if path.exists(directory2) and path.isdir(directory2):
pass
else:
mkdir(directory2) #‘创建pdf-xu这个文件夹用来保存转换后的pdf文件’
else:
#mkdir(directory1) #'测试用,建了也没用'
pass
###########################################################
def image2pdf():
global directory1
global directory2
#检查images-xu里面的图片在pdf-xu里面有没有同名的,有同名和后缀名不符的就不转换
fimagelist=listdir(directory1)
pdflist=listdir(directory2)
imagelist=[]
extentlist=[]
extname=['jpg','png']
for j in range(len(pdflist)):
pdflist[j]=path.splitext(pdflist[j])[0]
for i in range(len(fimagelist)):
imagelist.append(path.splitext(fimagelist[i])[0])
extentlist.append(path.splitext(fimagelist[i])[1])
if imagelist[i] in pdflist and extentlist[i] not in extname:
imagelist[i]=''
extentlist[i]=''
else:
continue
new_imagelist=[x for x in imagelist if x != ""]
new_extentlist=[y for y in extentlist if y != ""]
#清空pdf-xu
system(r'rm -rf directory2/*')
#开始转换并保存到pdf-xu里面
for k in range(len(new_imagelist)):
dire=path.join(directory1,new_imagelist[k]+new_extentlist[k])
targetdire=path.join(directory2,new_imagelist[k]+'.pdf')
im=Image.open(dire)
im.save(targetdire)
########################################################################
def breatheled():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12,GPIO.OUT)
p=GPIO.PWM(12,128)
p.start(0)
for dc in range(0,50,5):
p.ChangeDutyCycle(dc)
sleep(0.1)
for dc in range(50,-1,-5):
p.ChangeDutyCycle(dc)
sleep(0.1)
p.stop()
GPIO.cleanup()
##########################################################
def openled():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,GPIO.HIGH)
sleep(2)
GPIO.cleanup()
##################################################
def closeled():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,GPIO.LOW)
GPIO.cleanup()
##############################################
def main():
while True:
if len(disk_partitions())==firstnum: #‘如果没有插拔动作的话就什么都不执行’
breatheled()
sleep(1) #让它有时间清除端口
continue
else:
finddevice()
if disk_upan=="":
pass
else:
rwdirectorys(disk_upan)
openled()
sleep(1) #让它有时间清除端口
image2pdf()
closeled()
if __name__=='__main__':
main()
```