Python #Tools

介绍

本篇笔记主要是记录我利用python生成LaTex文件来将很多图片整理并保存到PDF的过程。作为科研人员,或者学生,生活中常常会遇到这样的场景:

  • 在听取报告的时候,我们经常会将我们感兴趣的报告的PPT拍下来,后续再去查阅相关资料。理想很丰满,现实很骨感,实际上很多时候PPT拍完我们就不再会去整理了,因为太麻烦了。一系列照片,挨个分类保存还是很麻烦的。
  • 在上课的时候,有的老师不会发PPT,遇到有疑问的也是手机保存一下。后续整理笔记也是会遇到照片太多不方便整理的情况。
  • 做实验的时候,或者仿真的时候,也会产生很多图片,我们想将这些图片放到PPT里面展示,但是图片太多的时候,挨个选取图片、插入、排版都会浪费我们不少的时间。

针对这个痛点,我决定用所学的编程知识让这一过程自动化,基本思路是:

  • 图片排版用Latex来完成,可以生成PDF的报告或者Beamer形式。
  • 插入图片的Latex代码用Python来完成。

下面是具体的实现

准备一个模板latex文件

我们需要先准备一个模板Latex文件,模板文件大致有所有的需要的基本代码,我的大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
\documentclass[mathserif]{beamer}
\usetheme{CambridgeUS}%主题
%\usetheme{default}%主题
%\usecolortheme{rose}
%\useoutertheme{smoothbars}
%\useinnertheme{circles}
\usepackage{subfiles}
\usepackage{subfigure}
%\usepackage{tcolorbox}
\usepackage{graphics,float}
\usepackage{bm}
\usepackage{lipsum}
\usepackage{mathrsfs}%花体插入的方法
\usepackage{listings}
\usepackage{float}
\usepackage{makecell}
\usepackage{bm}
\usepackage{indentfirst}
\usepackage{booktabs}
%\usepackage{ctex}
\usepackage{tikz}
%\usepackage[noend]{algpseudocode}
\begin{document}
\title{The title of report}
\author{Knifelees3}
\institute{HUST}
\date{\today}
\frame{\titlepage}

\begin{frame}
This note is a model for me to arrange files.

\end{frame}



\end{document}

我们要做的就是用Python读取这个模板文件的内容,然后将图片按照顺序贴出来。首先需要写一个函数可以列出我们所需要插入的图片文件的文件名列表

1
2
3
4
5
6
7
8
9
def list_files(dstdir):
pnglist = []
for filepath, dirnames, filenames in os.walk(dstdir):
for filename in filenames:
if "2" in filename and filename.endswith('.png'):
pnglist.append(filename)
return pnglist

# To obtain the str needed in latex file

然后是读取我们的模板文件的内容
1
2
3
4
5
6
7
8
def obtain_initial(filename):
lines = []
with open(filename, 'r', encoding='utf-8') as f:
for line in f.readlines():
if line != '\\end{document}':
lines.append(line)
f.close()
return lines

然后是有可能得写一个函数对图片名字进行纠正,比如如果我是用微信截图的,那么图片文件都会有”微信截图-“这样的开头,那么我就得写一个程序将前面的中文字符去掉,不然latex又得额外使用包来处理中文字符了。下面是我的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# To rename files by removing Chinese characters


def rename_png(filelist):
for file in filelist:
filenamestr = str(file)
filenew = filenamestr[5:]
print(filenew)
try:
os.rename(filenamestr, filenew)
except Exception as e:
print(e)
print('rename file fail\r\n')
else:
print('rename file success\r\n')

print('END')

然后最关键的一步就是将模板文件和插入图片的代码分别写到latex文件,其步骤如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# To generate latex files

def gentex(filename, filelist):
num = len(filelist)
modelfile = obtain_initial('./model_beamer.tex')
with open(filename, 'w', encoding='utf-8') as f:
for line in modelfile:
f.write('%s\n' % line)
for l in range(num):
f.write('\n')
f.write('\\begin{frame}\n')
f.write('\\begin{figure}\n')
f.write('\\centering\n')
f.write('\\includegraphics[width=2.5in]{%s}\n' % filelist[l])
f.write('\\end{figure}\n')
f.write('\\end{frame}\n')
f.write('\\end{document}\n')

f.close()

具体运行的全部代码我会附在末尾。最后整理出来的效果是啥样子的呢?下面是我的结果

一共46页PPT如果是自己手动插入图品会浪费很多的时间,但是我们这个方法就是非常自动化的方法了。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import os
import numpy as np
from shutil import copy2
# To list the files in a specific folders


def list_files(dstdir):
pnglist = []
for filepath, dirnames, filenames in os.walk(dstdir):
for filename in filenames:
if "2" in filename and filename.endswith('.png'):
pnglist.append(filename)
return pnglist

# To obtain the str needed in latex file


def obtain_initial(filename):
lines = []
with open(filename, 'r', encoding='utf-8') as f:
for line in f.readlines():
if line != '\\end{document}':
lines.append(line)
f.close()
return lines

# To rename files by removing Chinese characters


def rename_png(filelist):
for file in filelist:
filenamestr = str(file)
filenew = filenamestr[5:]
print(filenew)
try:
os.rename(filenamestr, filenew)
except Exception as e:
print(e)
print('rename file fail\r\n')
else:
print('rename file success\r\n')

print('END')

# To generate latex files


def gentex(filename, filelist):
num = len(filelist)
modelfile = obtain_initial('./model_beamer.tex')
with open(filename, 'w', encoding='utf-8') as f:
for line in modelfile:
f.write('%s\n' % line)
for l in range(num):
f.write('\n')
f.write('\\begin{frame}\n')
f.write('\\begin{figure}\n')
f.write('\\centering\n')
f.write('\\includegraphics[width=2.5in]{%s}\n' % filelist[l])
f.write('\\end{figure}\n')
f.write('\\end{frame}\n')
f.write('\\end{document}\n')

f.close()


if __name__ == "__main__":

# ______________________________________________________________
# On personal pc
rootdir = r'C:\Users\xiail\Documents\Dropbox\Note\VNote'
# dstdir = r'C:
# Users\xiail\OneDrive\Blog\Blog_V1\source\_posts\'
# test folder
dstdir = r'C:\Users\xiail\Desktop\量子计算'

pnglist = np.ravel(list_files(dstdir))
# rename_png(pnglist)
gentex("./test2.tex", pnglist)
try:
copy2('./test2.tex', dstdir)
except Exception as e:
print(e)
print('copy file fail\r\n')
else:
print('copy file success\r\n')

print('END')