본문
Python으로 PDF에서 워터마크(삽입그림) 지우기
모두의 프린터를 유용하게 사용해왔는데 이번에 사용중에 문제가 있었다. 문서 뒤에 박혀야할 워터마크가 문서 앞에 박혀서 본문 내용을 보이지 않게 하는것. 혹시나 해서 검색했는데 모프 공식 블로그에 떡하니 원하는 내용이 나와서 (재개발,재건축 클린업 시스템 - 워터마크 문제) 다행이었다. 아쉬운건 문제에 대해서 간략한 설명만 있지 해결책이 나와있지 않는다는것. 그래서 힌트를 바탕으로 나의 해결책을 공유한다.
원문에 언급되었듯 Inkscape를 사용하여 레이어를 지우거나 편집할 수 있다. 단, Inkscape에서는 이 워터마크를 레이어 창에서는 구분할 수 없고, 대신 XML 편집기에서 각 object에 해당하는 svg를 확인할 수 있다. (PDF에서 Layer는 OCG 또는 Optional Content Groups 로 부르는듯 하다) 마찬가지로 해당 object는 마우스로 선택할 수도 있다. 위의 그림처럼 특정 object를 누르면 테두리가 그려지며 선택되고 이를 지울 수 있다.
하지만 수십장에 이르는 문서를 일일히 지우는것은 엄청난 노가다인것. 그래서 파이썬으로 자동화 할 방법을 찾았고 결과적으로 아래의 소스를 실행하면 된다. 소스코드를 설명하자면, MOP.pdf를 불러와서 width가 1000이하인 워터마크 object들을 1x1 픽셀짜리 투명한 이미지로 교체하고 이를 output.pdf로 저장하는 것이다. (참고: pikepdf 매뉴얼) 이 과정으로 pdf 사이즈가 약간 줄어드는 효과도 나타난다.
from pikepdf import Pdf, PdfImage, Name
pdf = Pdf.open('.\MOP.pdf')
new_image = pdf.make_stream(b'\xff')
new_image.Width, new_image.Height = 1, 1
new_image.BitsPerComponent = 1
new_image.ImageMask = True
new_image.Decode = [0, 1]
for n, page in enumerate(pdf.pages):
xobjs=page.Resources.XObject
for imname, image in dict(xobjs).items():
if image.Width < 1000:
page.Resources.XObject[imname]=new_image
pdf.save('output.pdf')
댓글