계산 드릴 프린트 만들기

15366 단어 파이썬reportlabPDF

소개



초등학교 저학년을 위한 자습용 프린트를 만들기 위해 계산 드릴 생성 프로그램을 만들었습니다. 파이썬에서 무작위로 수식을 만들고 A4 용지 크기로 PDF화합니다. 작성한 파일을 자택이나 편의점 등으로 인쇄해, 아이가 자습해 주면 목적 달성입니다.

환경


  • Ubuntu 18.04 [Windows 10에서 WSL (Windows Subsystem for Linux) 사용]
  • python3.6

  • ReportLab 설치



    생성된 수식을 인쇄하기 위해 PDF화용 라이브러리 ReportLab을 사용합니다.
    $ sudo pip3 install ReportLab
    

    ReportLab에 대한 자세한 문서는 다음과 같습니다.
    htps //w w. Repo rt b. 이 m/도 cs/레포 rtぁb 우세 r구이에. pdf

    출력 이미지



    이번에는 2자리의 덧셈, 뺄셈, 곱셈을 프린트에 출력합니다.


    pdf 출력용 함수 drawString과 line의 사용법



    이번 프린트 작성은 주로 drawString()과 line()의 2개의 함수를 사용해 실현합니다. 프로그램 본체에 들어가기 전에, 기본적인 사용법만 정리해 둡니다.
    
    from reportlab.pdfgen import canvas
    from reportlab.pdfbase import pdfmetrics
    from reportlab.pdfbase.ttfonts import TTFont
    from reportlab.lib.pagesizes import A4
    
    # Canvasを作成。ファイル名とサイズを指定
    c = canvas.Canvas("calc_train.pdf",pagesize=A4)
    # 出力座標を設定
    x=0
    y=0
    # "hoge"という文字列を座標(0,0)に書き出し
    c.drawString(x,y,"hoge")
    # 直線を描画
    c.line(x,y,x+10,y)
    # pdf1ページを生成
    c.showPage()
    # ファイルを保存
    c.save()
    

    ReportLab의 좌표는 페이지의 "왼쪽 아래"가 원점입니다.

    계산 드릴 자동 생성 프로그램



    다음은 이번 목적인 ReportLab을 사용한 계산 드릴 자동 생성 프로그램입니다.
    import os, sys
    import random
    
    from reportlab.pdfgen import canvas
    from reportlab.pdfbase import pdfmetrics
    from reportlab.pdfbase.ttfonts import TTFont
    from reportlab.lib.pagesizes import A4
    
    # 5x5の計算式の基本座標
    x_list = [20, 130,  240, 350, 460]
    y_list = [730, 580, 430, 280, 130]
    # フォントを指定することも可能です
    fontname = "Helvetica"
    # 日本語を出力させる場合、下記のように設定します。
    # パスはご自身の環境を参照ください。
    #pdfmetrics.registerFont(TTFont(fontname,"/mnt/c/Windows/Fonts/msgothic.ttc"))
    
    # 計算式1個を指定した座標に出力する関数
    # 想定している計算は各要素が2桁以下です。
    def Set_calc(c,x,y,ope,d1,d2):
        # c: canvas
        # x, y : 座標
        # ope : 数学記号の文字列
        offset = 30
        _d1 = str(d1)
        _d2 = str(d2)
        # 文字幅の調整
        if(d1<10):
            _d1 = " " + _d1
        if(d2<10):
            _d2 = " " + _d2        
        c.drawString(x+offset, y,        _d1)
        c.drawString(x,        y-offset, ope)
        c.drawString(x+offset, y-offset, _d2)
        c.line(x,y-offset-5,x+offset*2.5,y-offset-5)
    
    # 1ページ分の計算式を生成する関数
    def Make_page(c,ope,d1_max,d2_max):
        # c: canvas
        # ope : 数学記号の文字列
        # d1_max, d2_max : 計算する値の最大値設定
        c.setFont(fontname,20)
        # ヘッダー部分の文字列出力
        c.drawString(5,800, " Name:  Day: /   ")
        c.setFont(fontname,30)
    
        # Set Value
        for row in y_list:
          for col in x_list:
            # 設定された最大値の中でランダムに要素を生成
            d1 = random.randint(1, d1_max)
            d2 = random.randint(1, d2_max)
            # 加算の場合
            if(ope=="+"):
                Set_calc(c,col,row,"+ ",d1,d2)
            # 減算の場合
            elif(ope=="-"):
                # 負の値は扱わない
                if(d1<d2):
                    tmp=d1
                    d1=d2
                    d2=tmp
                Set_calc(c,col,row,"- ",d1,d2)
            # 乗算の場合
            elif(ope=="x"):
                Set_calc(c,col,row,"× ",d1,d2)
            else:
                print("[Error] Not support operation:",ope)
        c.showPage()
    
    # 以下メイン関数
    print(" >>> Start")
    c = canvas.Canvas("calc_train.pdf",pagesize=A4)
    
    # 足し算 (各要素の最大値:99)
    Make_page(c,"+",99,99)
    # 引き算 (要素の最大値:99と9)
    Make_page(c,"-",99,9)
    # 引き算 2 (各要素の最大値:99)
    Make_page(c,"-",99,99)
    # 掛け算 (要素の最大値:99と9)
    Make_page(c,"x",99,9)
    c.save()
    
    print(" >>> Finish")
    
    

    위의 샘플을 실행하면 A4 크기 용지에 5x5개의 계산식이 출력됩니다. 자녀의 학년에 따라 계산 범위를 수정하여 1장당 계산식 수를 조정하여 사용해 보세요.



    이상입니다. 수고하셨습니다.

    좋은 웹페이지 즐겨찾기