파이썬으로 2018년 캘린더를 만들어 보았습니다.

안녕하세요! Python Advent Calendar 13일째 담당의 시게루입니다.
최근에는 Python을 이용한 기계 학습이 유행하고 있습니다. 그 중에서 기계 학습한 데이터를 pdf 등의 외부 파일에 출력할 수 있다면 새로운 표현 방법이 늘어나지 않을까요?

목적



파이썬으로 PDF 형식의 캘린더를 만듭니다.
날짜와 이미지(URL or path)를 지정하는 것만으로 간단하게 캘린더를 만들 수 있으면 좋겠다.





소스 코드



리포지토리

환경 구축



완제품을 실행하려면 다음 명령으로 실행할 수 있습니다.
image_path는 URL/path를 지원하므로 쉽게 캘린더를 만들 수 있습니다.
 $ pip3 install reportlab
 $ git clone https://github.com/4geru/pdf-calendar.git
 $ python3 make_pdf.py 2018 1 image_path

흐름



캘린더 만들기 절차는 다음과 같습니다.
pdf에 관한 설정・문자의 표시・선, 화상의 묘화에 대해 다루어 갑니다.

make_pdf.py
def make(year,month, img):
  pdf_canvas = set_info("{0:04d}-{1:02d}".format(year,month)) # pdfの設定をする
  print_title(pdf_canvas, year, month) # titleの表示
  print_image(pdf_canvas, img)
  print_box(pdf_canvas) # 箱の描画   
  print_word(pdf_canvas, year, month) # 日付の描画
  pdf_canvas.save() # pdfを保存

초기 설정



pdf 그리기 화면을 설정합니다.
def set_info(filename):
  # 保存先とファイル名の設定
  pdf_canvas = canvas.Canvas("./calendar/{0}.pdf".format(filename), bottomup=False, pagesize=letter)  # 原点は左上

  # ファイル情報の登録(任意)
  pdf_canvas.setTitle(filename)
  pdf_canvas.setSubject(filename + 'のカレンダー')      
  pdf_canvas.setAuthor("4geru")

  # キャンバス情報の追加
  return pdf_canvas

문자 표시



색상 수정


  • 글꼴 색상 설정 HexColor와 단색으로 색상을 변경할 수 있습니다

  • make_pdf.py
    def same_month_color(weekday):
      #ef5350 red lighten-1
      if weekday == 0: return color.HexColor("0xef5350")
      #42a5f5 blue lighten-1 
      if weekday == 6: return color.HexColor("0x42a5f5")
      return color.black
    
  • 폰트 변경
    폰트는 UnicodeCIDFont'HeiseiKakuGo-W5'를 사용하고 있지만,
    TTFont 을 사용하면 다른 글꼴도 사용할 수 있습니다.

  • 문자 그리기



    make_pdf.py
    def print_title(pdf_canvas, year, month):
      # フォントの設定
      font = 'HeiseiKakuGo-W5'
      pdfmetrics.registerFont(UnicodeCIDFont(font))
      pdf_canvas.setFont(font, 20)
    
      # 文字の描画
      pdf_canvas.drawString(config.space, config.title.height, "{0}年 {1}月のカレンダー".format(year, month))
    

    선 그리기



    pdf_canvas.line에서 선을 그릴 수 있습니다.
    왼쪽에서 오른쪽으로 · 위에서 아래로 선을 늘리기 위해 가로선은 왼쪽 끝 · 세로선은 위의 위치를 ​​결정합니다.

    make_pdf.py
    # カレンダーの線の表示
    def print_box(pdf_canvas):
      pdf_canvas.setStrokeColor(color.black) # 色の設定
      step = config.step # 線と線の間隔
      # 縦の開始点
      top  = config.title.height + config.image.height + config.space * 2
      width = step * 7 # 横幅
      height = step * 5 # 縦
      left = (config.width - width)/2 # 横の開始点
      for i in range(0,8):
        x = left + step * i
        pdf_canvas.line(x , top, x, top + height)
      for i in range(0,6):
        y = top + step * i
        pdf_canvas.line(left, y, config.width - left, y)
    

    사진 표시



    PDF로 이미지를 표시하려면 PIL을 사용하여 이미지를 표시합니다.
    PIL을 사용한 것만으로 왼쪽의 그림이 되어 버립니다. 하지만 이미지를 로드한 후 transpose에서 위아래로 바꾸면 오른쪽 그림과 같이 표시할 수 있습니다.





    이미지의 drawInlineImage는 drawInlineImage(그리기 이미지, 왼쪽 시작점, 위 시작점, 가로 길이, 세로 길이)로 설정할 수 있습니다.
    왼쪽 시작점은 이미지 옆의 길이에 비례하므로 적절한 표현식이 할당됩니다.
    세로 시작점은 이미지가 상하 반대로 그려지기 때문에 그만큼 아래에 그립니다.

    make_pdf.py
    def print_image(pdf_canvas, img):
      image = ''
      if img.find('http') == -1: # URL出なかった時
        image = Image.open(img).transpose(Image.FLIP_TOP_BOTTOM)
      else: # URLだった時
        f = io.BytesIO(urlopen(img).read())
        image = Image.open(f).transpose(Image.FLIP_TOP_BOTTOM)
    
      height = config.image.height # 縦の長さの設定
      # 縦に合わせて横の長さの設定
      width = image.width * config.image.height / image.height
      top = config.title.height + config.space
      pdf_canvas.drawInlineImage(image,config.width/2-width/2,top-height, width, height)
    

    참고


  • pdf 작성
    파이썬으로 PDF를 생성하고 주사위를 만들고 싶습니다.
    PDF 생성(ReportLab) - Python 입문부터 응용까지의 학습 사이트
  • 이미지 삽입
    파이썬에서 ReportLab을 사용하여 PDF 파일을 만드는 방법 ~ 2 ~ - Live the Life you Love
    Python + Pillow (PIL)로 이미지 회전 (rotate, transpose) - Symfoware

  • 마지막으로



    곧 크리스마스 · 새해입니다. . .
    파이썬 캘린더를 사용하여 주변 친구와 가족에게 원래 캘린더를 만들면 기뻐할 수 있을까요?
    꼭 사용해보십시오.

    추가


  • 2017/12/13 : 공휴일을 표시할 수 있도록 했습니다.
  • $ pip3 install jcal
    

    에서 사용할 수 있게 됩니다.

    좋은 웹페이지 즐겨찾기