这里写自定义目录标题
开篇语
科技服务生活是长久不变的话题,如何让计算机更好的服务教育,更好的服务老师,更好的服务学生,也是我们深度思考的话题,最近一直在调试的一款产品很是喜爱,因为这款软件可以帮助我们生成老师教学的利器,学生学习的助手,教学沉淀的黄金屋。
生成的pdf成品书
下图是我们通过编程生成的PDF:
- 全新设计 ,导航目录让我们快速定位书籍的指定章节
- 页眉LOGO 可以根据要求设计属于你的个性化ID
- 章节标题 快速的熟悉本章轮廓
- 小节信息 精准的定位教材知识的脉络层次
- 编号 快速查找书籍的关键知识点
- 图片 准确的对知识图像化描述
- 正文 具体阐述知识的信息
- 页脚 定位页面位置
代码设计思想:
使用库如下:
import os #系统库
import time #时间库
from reportlab #PDF文档生成库
import imagesize #图片尺寸修改库
import win32con #控制Acrobe软件,输助
import win32event #控制Acrobe软件,输助
from win32comext#控制Acrobe软件,输助
1、试题素材处理
通过以下代码实现对试题的自动化格式处理,处理后的试题内容,可以直接添加到主程序内部使用,大大提高工作效率。
text="""
1. 下列估算合理的是( )
A.两个鸡蛋的重力约为1N
B.人的正常体温约为38℃
C.光的传播速度约为340m/s
D.人体的安全电压约为380V
2. 下列关于声音的说法正确的是( )
A. 声音是由于物体振动产生的
B.声音可以在真空中传播
C. 戴耳罩是为了在声源处减弱噪声
D. 超声加湿器利用了声音能传递信息
3. 如图所示的现象中,由于光的折射形成的是( )
A.小孔成像
B.阳光经物体表面到人眼
C.凸透镜成像
D.简易潜望镜
.................
"""
def imgnames_num(img_name='hljhrb_dxt'):
import os,re
#设置要筛选的文件夹路径
folder_path="C:/Users/13357/PycharmProjects/python_ocv/pdfbook/pdfdir-master/img/physics_img/"
#设置变量image_id存储文件名数字
image_ids=[]
# 遍历文件夹
for root,dirs,files in os.walk(folder_path):
for fl in files:
if fl.startswith(img_name):
image_id = re.findall(r'\d+', fl)
image_ids.extend(image_id)
return image_ids
imgN=imgnames_num()
aws_ipt = ':AA' #试题答案
result=text.split('\n')
aws = [letter for letter in aws_ipt]
man = []
def myTest(t_c ='dxt', th=0,aws=aws,sh='',text1='',text2='',tt_an='',tt_jx='',idzz=''):
i = 0
for idx,rs in enumerate(result):
a = i
if idx == 1:
print('''
class Com_hljhrb():
''')
M_head = f'''
#---------最新更新试题--------------------------------------------------
class Complete_stk_{sh}():
from pdfbook.physics_test.Complete_kst_2022 import Com_{sh}
ct.append(PageBreak())
ct.append(Gp.draw_img('anhui_testimg.png', 0.02))
ct.append(Spacer(0, 0.8 * cm))
ct.append(Gp.draw_title(f'第《{str('{idzz}')}篇2022中考物理真题卷》'))
ct.append(Gp.draw_Drawing_line(240, y_pos=12))
ct.append(Spacer(0, 0.3 * cm))
xj_ct = '2022黑龙江哈尔滨市'
ct.append(Gp.dr_txt(f"""本试题为{str('{xj_ct}')}中考真题,请认真阅读本套试题{str('{E}')}"""
, fs=13))
ct.append(Spacer(0, 0.3 * cm))
# 前2行代码是突显的核心内容, 第3行是知识的序号部分, 第4行到行尾是导入的试题正文
sub = '单选题'
test_k = '总分:24分(每题2分)'
ct.append(Gp.dr_t2(f"""{str('{xj_ct}')}_{str('{sub}')}_{str('{test_k}')}""" , 3, 0))
'''
man.append(M_head)
if idx%5==1: #按照从1开始,每隔5行,输出一次题目
print(f'''
def {t_c}{th+a}(th="{th+a}",key=2):
text = f"""{rs}"""
''')
print(" "*20+'t1 =f"""')
elif idx%5 != 1: # 按照从2开始,输出选项
print(" "*24+rs) #12位空格,加字符输出,每个题目的四行选项输出
if rs.startswith('D'):
i+=1
#print(" "*12+rs)
print(" "*20+'"""')
print(f'''
if key==1:
tt_aws = f"""
{str('{E}')}{str('{KG*40}')} 【答案】 {aws[i]}
"""
tt_jx = " "
elif key==2:
tt_jx = " "
tt_aws = " "
else:
tt_aws = " "
tt_jx = " "
th = th
return text, t1,tt_aws, tt_jx, th
''') #选项后面输出其它内容
inf = f'''
text1, text2, tt_an, tt_jx, th = Com_{sh}.{t_c}{th+a}() # 导入{th + a}试题库
ct.append(Gp.dr_txt(f"{str('{text1}')}")) #题目
#ct.append(Gp.draw_img(f'{sh}_{t_c}{str("{th}")}.png', 0.02)) # 无图
ct.append(Gp.dr_txt(f"{str('{text2}')}")) #小问题(选项)
ct.append(Gp.dr_txt(f"{str('{tt_an}')}")) #答案
ct.append(Gp.dr_txt(f"{str('{tt_jx}')}")) #解析
'''
for img in imgN:
img = eval(img)
if th+a== img:
inf = f'''
text1, text2, tt_an, tt_jx, th = Com_{sh}.{t_c}{th + a}() # 导入{th + a}试题库
ct.append(Gp.dr_txt(f"{str('{text1}')}")) #题目
ct.append(Gp.draw_img(f'{sh}_{t_c}{str("{th}")}.png', 0.02)) # 有图
ct.append(Gp.dr_txt(f"{str('{text2}')}")) #小问题(选项)
ct.append(Gp.dr_txt(f"{str('{tt_an}')}")) #答案
ct.append(Gp.dr_txt(f"{str('{tt_jx}')}")) #解析
'''
man.append(inf)
for i in man:
print(i)
myTest(t_c='dxt',th=1,sh='hljhrb')
if __name__ =='__main__':
pass
2、目录导航处理
在设计目录导航时,花费了几天的时间,费劲周折,尝试了好多种方法,也尝试使用其它软件,但因为处理太麻烦,经过查找资料分析研究,最终通过修改afterFlow()函数的方法,问题得到解决:
def afterFlowable(self, flowable):
key = 'h{}-{}'.format(style[-1:], self.seq.nextf(style))
self.canv.bookmarkPage(key) #提取到的所有页面的Heading值添加到标签中.
#把提供的文本内容及更新的序列添加到pdf文档中.
self.canv.addOutlineEntry(text, key, 0, 0)
3、页眉函数添加
这里我调用了一个针对pdf的函数方法,def myMainPageFrame(canvas, doc_toc): 把在页面设置的相关信息全部添加到这个方法内:
- pic_ym = output_imgFile(‘wl_logo.png’,img_Num=‘physics’) 添加页眉的LOGO
- canvas.setFont(‘sun’, 9) 设置字体字号
- canvas.line(75, 790, 575, 790) 绘制页眉线
- canvas.drawCentredString(17.5*cm, 0.55 * inch,
“Page-{} / {}” .format(pageNumber, pageinfo)) 写入页码信息
4、页眉函数添加到模板内
通过把页眉函数添加到函数方法class MyDocTemplate(BaseDocTemplate)模板内,实现了在生成PDF时,自动更新页面信息到多页pdf中。
class MyDocTemplate(BaseDocTemplate): # 自定义模版类
template1 = PageTemplate('normal', [frame1], myMainPageFrame)
5、自定义格式函数
书名函数
标题函数
段落文字函数
绘制线条函数
插入图形函数
插入表格函数
目录格式函数
最后生成成品
由于文件代码过多,仅在这里提供制作思路和制作过程中遇到的问题解决的办法,希望对浏览文章的你起到帮助使用,德天老师祝学习愉快!