파이썬으로 2018년 캘린더를 만들어 보았습니다.
최근에는 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
문자 표시
색상 수정
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 생성(ReportLab) - Python 입문부터 응용까지의 학습 사이트
파이썬에서 ReportLab을 사용하여 PDF 파일을 만드는 방법 ~ 2 ~ - Live the Life you Love
Python + Pillow (PIL)로 이미지 회전 (rotate, transpose) - Symfoware
마지막으로
곧 크리스마스 · 새해입니다. . .
파이썬 캘린더를 사용하여 주변 친구와 가족에게 원래 캘린더를 만들면 기뻐할 수 있을까요?
꼭 사용해보십시오.
추가
$ pip3 install jcal
에서 사용할 수 있게 됩니다.
Reference
이 문제에 관하여(파이썬으로 2018년 캘린더를 만들어 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/4geru/items/e0ce0e574a329939e204텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)