【编程与物理】从打造的适用型pdf电子书谈起

开篇语

科技服务生活是长久不变的话题,如何让计算机更好的服务教育,更好的服务老师,更好的服务学生,也是我们深度思考的话题,最近一直在调试的一款产品很是喜爱,因为这款软件可以帮助我们生成老师教学的利器,学生学习的助手,教学沉淀的黄金屋。

生成的pdf成品书

下图是我们通过编程生成的PDF:
在这里插入图片描述

  1. 全新设计 ,导航目录让我们快速定位书籍的指定章节
  2. 页眉LOGO 可以根据要求设计属于你的个性化ID
  3. 章节标题 快速的熟悉本章轮廓
  4. 小节信息 精准的定位教材知识的脉络层次
  5. 编号 快速查找书籍的关键知识点
  6. 图片 准确的对知识图像化描述
  7. 正文 具体阐述知识的信息
  8. 页脚 定位页面位置

代码设计思想:

使用库如下:

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): 把在页面设置的相关信息全部添加到这个方法内:

  1. pic_ym = output_imgFile(‘wl_logo.png’,img_Num=‘physics’) 添加页眉的LOGO
  2. canvas.setFont(‘sun’, 9) 设置字体字号
  3. canvas.line(75, 790, 575, 790) 绘制页眉线
  4. 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、自定义格式函数

书名函数

在这里插入图片描述

标题函数

在这里插入图片描述

段落文字函数

在这里插入图片描述

绘制线条函数

在这里插入图片描述

插入图形函数

在这里插入图片描述

插入表格函数

在这里插入图片描述

目录格式函数

在这里插入图片描述

最后生成成品

在这里插入图片描述
由于文件代码过多,仅在这里提供制作思路和制作过程中遇到的问题解决的办法,希望对浏览文章的你起到帮助使用,德天老师祝学习愉快!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值