PDF에 워터마크 삽입하기 [2/2]
글 작성자: HEROHJK
저번 포스트에 이어서 마저 작성합니다.
저번에 이미지를 PDF로 바꿔봤는데요, 오늘은 그 이미지 PDF를 페이지PDF에 합성하는 부분을 처리 해 보겠습니다.
다음은 샘플 pdf파일과 최종 완성 비교 사진입니다.
이제 시작 해 보겠습니다.
다음과같이 PyPDF2 라이브러리를 설치 해 줍니다
(유명한 PDF 편집 라이브러리입니다)
pip install pypdf2
PDF를 합성하는건 비교적 쉽습니다.
코드를 보시죠.
from PyPDF2 import PdfFileReader, PdfFileWriter
def PDFMerge(savePath, pdfPath, watermarkPdfPath):
# pdf파일 불러오기
pdfFile = open(pdfPath,'rb')
pdfReader = PdfFileReader(pdfFile, strict=False)
# 워터마크 PDF파일 불러오기
watermarkPdfFile = open(watermarkPdfPath, 'rb')
watermarkPdf = PdfFileReader(watermarkPdfFile, strict=False).getPage(0)
pdfWriter = PdfFileWriter()
#PDF 페이지 수만큼 반복
for pageNum in range(pdfReader.numPages):
#페이지를 불러온다
pageObj = pdfReader.getPage(pageNum)
#중앙으로 놓기 위해 좌표를 구한다
x = (pageObj.mediaBox[2] - watermarkPdf.mediaBox[2]) / 2
y = (pageObj.mediaBox[3] - watermarkPdf.mediaBox[3]) / 2
# 워터마크페이지와 합친다
pageObj.mergeTranslatedPage(page2=watermarkPdf, tx=x, ty=y, expand=False)
#합친걸 저장할 PDF파일에 추가한다
pdfWriter.addPage(pageObj)
#저장
resultFile = open(savePath, 'wb')
pdfWriter.write(resultFile)
간단합니다. pdf파일과 워터마크를 불러오고, 빈 PDF파일을 생성합니다.
두 PDF를 합쳐서 빈 PDF파일에 집어넣습니다.
이 행동을 PDF파일 페이지 수 만큼 반복합니다.
그리고 저장하면 끝입니다.
조금 궁금하실만한점을 생각 해 보자면, mediaBox에서 2와 3인데요, 저부분은 PyPDF2 RectangleObject를 참조하시면 됩니다.
0,1 은 아래 -> 위 방향의 xy좌표
2,3 은 위 -> 아래 방향의 xy좌표 입니다.
쨋든 이렇게 PDF에 워터마크를 삽입하는 코드가 완료되었습니다.
전체 코드는 다음과 같습니다.
# -*- coding:utf-8 -*-
import sys #매개변수를 입력받기 위해 사용
from PIL import Image
from reportlab.pdfgen.canvas import Canvas
from PyPDF2 import PdfFileReader, PdfFileWriter
def ClearWhiteBackground(image):
#RGBA로 속성 변경
image = image.convert('RGBA')
#해당 이미지의 배열 받아오기
imageData = image.getdata()
newImageData = []
for pixel in imageData:
if pixel[0] > 240 and pixel[1] > 240 and pixel[2] > 240:
# rgb값이 240,240,240 이상일 경우(흰색에 가까울 경우) 알파값을 0으로 준다
newImageData.append((0,0,0,0))
else:
# 아닐경우 그대로 쓴다
newImageData.append(pixel)
#이미지를 덮어 씌움
image.putdata(newImageData)
return image
def ImageToPDF(imagePath, pdfPath):
newCanvas = Canvas(pdfPath, pagesize=Image.open(imagePath,'r').size)
newCanvas.drawImage(image=imagePath,x=0,y=0, mask='auto')
newCanvas.save()
def PDFMerge(savePath, pdfPath, watermarkPdfPath):
# pdf파일 불러오기
pdfFile = open(pdfPath,'rb')
pdfReader = PdfFileReader(pdfFile, strict=False)
# 워터마크 PDF파일 불러오기
watermarkPdfFile = open(watermarkPdfPath, 'rb')
watermarkPdf = PdfFileReader(watermarkPdfFile, strict=False).getPage(0)
pdfWriter = PdfFileWriter()
#PDF 페이지 수만큼 반복
for pageNum in range(pdfReader.numPages):
#페이지를 불러온다
pageObj = pdfReader.getPage(pageNum)
#중앙으로 놓기 위해 좌표를 구한다
x = (pageObj.mediaBox[2] - watermarkPdf.mediaBox[2]) / 2
y = (pageObj.mediaBox[3] - watermarkPdf.mediaBox[3]) / 2
# 워터마크페이지와 합친다
pageObj.mergeTranslatedPage(page2=watermarkPdf, tx=x, ty=y, expand=False)
#합친걸 저장할 PDF파일에 추가한다
pdfWriter.addPage(pageObj)
#저장
resultFile = open(savePath, 'wb')
pdfWriter.write(resultFile)
def Test():
argList = sys.argv
'''
매개변수에 두번째는 이미지가 있는 경로, 세번째는 이미지의 이름, 네번째는 PDF파일의 경로가 들어온다
첫번째는 파일의 경로 고정
ex) 'C:\\ImageToPDF.py' 'C:\\ImagePath\\' 'sample.jpg' 'testpage.pdf'
'''
image = Image.open(argList[1]+argList[2],'r')
clearImage = ClearWhiteBackground(image)
clearImage.save(argList[1]+'clearSample.png')
ImageToPDF(argList[1]+'clearSample.png', argList[1]+'watermarkImage.pdf')
PDFMerge(argList[1]+'complete.pdf', argList[1]+argList[3], argList[1]+'watermarkImage.pdf')
Test()
코드를 조금 응용해서 글씨를 써 넣을수도, 로테이션을 줄 수도 있습니다.
그리고 이미지에 투명도를 조금 더 설정해서 글씨 뒤로 보내는것처럼 보이게 할 수도 있습니다
그 부분들은 크게 어렵지 않은 부분들이니 한번 해 보시길 바랍니다.
반응형
댓글
이 글 공유하기
다른 글
-
Xcodes를 사용할 때, 간단하게 터미널로 심볼릭 링크를 만들어주는 파이썬 스크립트.
Xcodes를 사용할 때, 간단하게 터미널로 심볼릭 링크를 만들어주는 파이썬 스크립트.
2023.04.25 -
OpenCV를 이용하여 투명한 이미지 반전시키기
OpenCV를 이용하여 투명한 이미지 반전시키기
2020.06.04 -
PDF에 워터마크 삽입하기 [1/2]
PDF에 워터마크 삽입하기 [1/2]
2019.01.23
testpage.pdf
ImageToPDF.py