Python 30์ผ๐จโ๐ป - 21์ผ์ฐจ - ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ
ํ์ ์ฒ๋ฆฌ
์ฝ๊ฒ ๋งํ๋ฉด ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐํํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์ ๋ํด ํน์ ํ ์กฐ์์ ํ๋ ๋ฐฉ๋ฒ์ด๋ ๊ธฐ์ ์ด๋ค.Python์์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ ์ ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด
๋ฒ ๊ฐ - https://pillow.readthedocs.io/en/stable/index.html
์ค์น์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๋ฒ ๊ฐ ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค.https://pillow.readthedocs.io/en/stable/index.html
๋ช ๋ น
pip install Pillow
์ ์ฌ์ฉํ์ฌ ๋ช
๋ น์ค์ ์ฌ์ฉํ์ฌ Pillow๋ฅผ ์ค์นํ ์ ์์(ํน์ OS ๋ช
๋ น์ ๋ฌธ์ ๋ณด๊ธฐ)๊ทธ๋ฆผ ์ฒ๋ฆฌ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ๋๊ฐ ๋์์ต๋๋ค.์ฒซ ๋ฒ์งธ๋ ํด๋์ ๋ชจ๋ JPEG ํ์์ ์ด๋ฏธ์ง๋ฅผ PNG ํ์์ ์ด๋ฏธ์ง๋ก ๋ณํํ๊ณ ๋ค๋ฅธ ํด๋์ ์ ์ฅํ๋ ๊ธฐ๋ณธ ์ด๋ฏธ์ง ๋ณํ๊ธฐ์ ๋๋ค.https://unsplash.com์์ JPEG ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ์ฌ
images
ํด๋์ ์ ์ฅํ์ต๋๋ค.์คํฌ๋ฆฝํธ๋ ๋ชจ๋ JPEG ์ด๋ฏธ์ง๋ฅผ ์ฝ๊ณ PNG๋ก ๋ณํํ ๋ค์ ์ ํด๋ generated
์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.๋ค์์
image_convertor.py
Here is the GitHub repository link for the project.์ด๋ผ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฝ๋์
๋๋ค.์๋ณธ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ํฌ๊ธฐ ๋๋ฌธ์, ๋๋ ๋จผ์ ํฌ๊ธฐ๋ฅผ ์์ ํฌ๊ธฐ๋ก ์กฐ์ ํ ๋ค์์ ๊ทธ๊ฒ์ ๋ณํํ์ฌ ์คํฌ๋ฆฝํธ์ ์ฑ๋ฅ์ ํฅ์์์ผฐ๋ค.
image_converter.py
import os
from PIL import Image
# fetch all the files from the source folder
dirname = 'images'
output_dirname = 'generated'
images_list = os.listdir(dirname)
# check if output folder exits otherwise create it
if not os.path.exists(output_dirname):
os.makedirs(output_dirname)
for image in images_list:
# split the filename to separate the format and name
name, format = os.path.splitext(image)
original = Image.open(f'{dirname}\{image}')
# resize image to a standard size and to reduce file size
size = 1000,1000
# thumbnail maintains aspect ratio
original.thumbnail(size)
# save image as png format
original.save(f'{output_dirname}\{name}.png')
์คํฌ๋ฆฝํธ๋ ํฐ๋ฏธ๋ python image_converter.py
์์ ์คํํ ์ ์์ผ๋ฉฐ ํด๋์ ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค.๋ด๊ฐ ๋ง๋ ๋ ๋ฒ์งธ ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ๊ทธ๋ฆผ์ ํ๋ฐฑ ๊ทธ๋ฆผ์ผ๋ก ๋ณํํ๋ ๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ๊ธฐ์ ๋๋ค.๋ฒ ๊ฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฆผ์ ๋ง์ ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ ๊ทธ๋ ์ด์ค์ผ์ผ์ด ๊ทธ ์ค์ ํ๋์ด๋ค.
grayscale_converter.py
import os
from PIL import Image, ImageFilter
# fetch all the files from the source folder
dirname = 'images'
output_dirname = 'greyscale'
images_list = os.listdir(dirname)
# check if output folder exits otherwise create it
if not os.path.exists(output_dirname):
os.makedirs(output_dirname)
for image in images_list:
# split the filename to separate the format and name
name, format = os.path.splitext(image)
original = Image.open(f'{dirname}\{image}')
# resize image to a standard size and to reduce file size
size = 1000, 1000
# thumbnail maintains aspect ratio
original.thumbnail(size)
# convert the image to greyscale
grayscale_image = original.convert('L') # L mode means greyscale
grayscale_image.save(f'{output_dirname}\{image}')
๋ง์ง๋ง์ผ๋ก, ๋๋ ๋ชจ๋ ์ด๋ฏธ์ง์ ๋ก๊ณ ๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ๋ค๋ฅธ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์๋ค.์ด๊ฒ์ ์ด๋ฏธ์ง๋ฅผ ํตํฉํ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ค.๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋์ ์ด๋ฏธ์ง ์์ฉ ๋ธ๋๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ์ด๊ฒ์ ๋งค์ฐ ์ ์ฉํ ๊ฒ์ด๋ค.๋๋ ํ์ง๋ฅผ ํ๋ ๋ฌ์๋ค.png ์ด๋ฏธ์ง ํ์ผ์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์ ์ ์ฅํฉ๋๋ค.brand_stamp.py
import os
from PIL import Image, ImageFilter
# fetch all the files from the source folder
dirname = 'images'
output_dirname = 'branded'
images_list = os.listdir(dirname)
logo = Image.open('logo.png')
# check if output folder exits otherwise create it
if not os.path.exists(output_dirname):
os.makedirs(output_dirname)
for image in images_list:
# split the filename to separate the format and name
name, format = os.path.splitext(image)
original = Image.open(f'{dirname}\{image}')
# resize image to a standard size and to reduce file size
size = 1000, 1000
# thumbnail maintains aspect ratio
original.thumbnail(size)
# create a copy of the image
image_copy = original.copy()
# obtain the position to place the logo
position = ((image_copy.width - logo.width),
(image_copy.height - logo.height))
# The third parameter makes it transparent
image_copy.paste(logo, position, logo)
image_copy.save(f'{output_dirname}\{name}.png')
๊ทธ๊ฑฐ ์ ๋ง ๋ฉ์๋ค!์ด๊ฒ์ ๋จ์ง ๊ทธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ํ๋ฉด์ผ ๋ฟ์ด๋ค.๋๋ ์ด๊ฒ์ด ์ข์ ์ถ๋ฐ์ ์ผ๋ก ๋ฏธ๋์ ํ๋ก์ ํธ๋ฅผ ์ฐฝ์คํ ๋ ๋์ฑ ํ์ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค.๋ค์์ ๋ฉ์ง ์์๋ค์ ๋๋ค. ํ์ดํค์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ๊ด๋ จ์ด ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
PDF ํ์ผ ์์
๊ทธ๋ฆผ์ ๊ฐ์ง๊ณ ๋ ธ๋ ๊ฒ ์ธ์ ๋๋ PDF ํ์ผ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค์ ์ฉ๋ก๋ฅผ ๋ฐํ์ผ๋ก PDF ํ์ผ์ ์ฒ๋ฆฌํ๋ ๊ธฐ์ด ์ง์์ ํ์ํ๋ค.PDF๋ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ฐ์ฅ ๊ด๋ฒ์ํ ํ์ผ ํ์ ์ค ํ๋์ ๋๋ค.
์ ๊ฐ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ PyPDF2 https://pypi.org/project/PyPDF2/์ ๋๋ค. ์ด๊ฒ์ ์ ๊ฐ PyPI์์ ์ฐพ์ ๋งค์ฐ ์ ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
pip
๋ช
๋ น pip install PyPDF2
์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด๋ก๋ ๊ฐ๋ฅPDF ๋๋ ํ ๋ฆฌ์ ์์ PDF ํ์ผ์ ์ถ๊ฐํ์ต๋๋ค.
๋ด๊ฐ ๋ง๋ ์ฒซ ๋ฒ์งธ ์คํฌ๋ฆฝํธ๋ ์ฃผ๋ก PDF ํ์ผ์์ ์์ฑ์, ํ์ด์ง ์, ์ฃผ์ , ์ ๋ชฉ ๋ฑ์ ์ ๋ณด๋ฅผ ์ถ์ถํฉ๋๋ค.
info_extractor.py
from PyPDF2 import PdfFileReader
def extract_information(pdf_path):
with open(pdf_path, 'rb') as f:
pdf = PdfFileReader(f)
information = pdf.getDocumentInfo()
number_of_pages = pdf.getNumPages()
txt = f"""
Information about {pdf_path}:
Author: {information.author}
Creator: {information.creator}
Producer: {information.producer}
Subject: {information.subject}
Title: {information.title}
Number of pages: {number_of_pages}
"""
print(txt)
return information
if __name__ == '__main__':
path = 'pdfs/sample1.pdf'
extract_information(path)
python info_extractor.py
์ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.PDF ํ์ผ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ธ์ํ ์ ์์ด์ผ ํฉ๋๋ค.๋ง์ง๋ง์ผ๋ก ๋ธ๋๋ ID๋ฅผ ๋ชจ๋ PDF์ ์ํฐ๋งํฌ๋ก ์ถ๊ฐํ๋ ๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ต๋๋ค.์ด๋ฅผ ์ํด ์ํฐ๋งํฌ๊ฐ ์๋ ๋ก๊ณ ๋ง ์๋ ๋ค๋ฅธ ๋น PDF๋ฅผ ๋ง๋ค์์ต๋๋ค.์ด์ PDF ํ์ผ๊ณผ ๋ณํฉํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.์ํฐ๋งํฌ๊ฐ ์๋ PDF๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ํํ ์๊ตฌ์ด๋ฉฐ, ์ด ์์ ์ ์๋ํํ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ฉํ ์ ์๋ค.
pdf_watermarker.py
from PyPDF2 import PdfFileWriter, PdfFileReader
def create_watermark(input_pdf, output, watermark):
watermark_obj = PdfFileReader(watermark)
watermark_page = watermark_obj.getPage(0)
pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()
# Watermark all the pages
for page in range(pdf_reader.getNumPages()):
page = pdf_reader.getPage(page)
page.mergePage(watermark_page)
pdf_writer.addPage(page)
with open(output, 'wb') as out:
pdf_writer.write(out)
if __name__ == '__main__':
create_watermark(
input_pdf='pdfs/sample1.pdf',
output='pdfs/watermarked_sample.pdf',
watermark='pdfs/watermark.pdf')
python pdf_watermarker.py
์ ์คํํ ๋๋ ์ํฐ๋งํฌ๊ฐ ์๋ PDF ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค.PDF๋ก ํ ์ ์๋ ์ผ์ด ๋ง์ต๋๋ค.๊ทธ๋ฌ๋ ๋๋ ๋จ์ง ๊ธฐ์ด ์ง์์ ํตํด ์ด ๊ณผ์ ์ ์ตํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.๋๋ PDF ์ฒ๋ฆฌ๋ฅผ ๊น์ด ์ฐ๊ตฌํ๊ธฐ ์ํด ํ๋ฅญํ ์์์ ์ฐ๊ฒฐํ๊ณ ์๋ค.
๋ค์์ ํ์ดํค์์ PDF๋ฅผ ์ฒ๋ฆฌํ๋ ์ฐธ๊ณ ์๋ฃ๋ค์ ๋๋ค.
์ค๋์ ์ฌ๊ธฐ๊น์ง.๋ด์ผ์ ํธ์ํฐ๋ฅผ ์ํ ์๋ ๋ก๋ด ๊ตฌ์ถ, ์ด๋ฉ์ผ ๋ฐ์ก ๋ฑ ์คํฌ๋ฆฝํธ์ ๋ํ ๋ ๋ง์ ๋ด์ฉ์ ํ์ํ ๊ฒ์ด๋ค.
์ฆ๊ฑฐ์ด ์๊ฐ ๋ณด๋ด์ธ์!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Python 30์ผ๐จโ๐ป - 21์ผ์ฐจ - ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/arindamdawn/30-days-of-python-day-21-scripting-basics-32hnํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค