본문 바로가기

일상

python-pptx로 투명도와 그라데이션 넣기 (안 먹는 속성 대신 XML 직접 쓰기)

반응형

라이브러리가 제공하는 속성인데 파일에는 반영되지 않는 경우와, 그 자리를 XML 한 조각으로 메우는 방법입니다.


HTML 로 만든 시안을 파워포인트로 옮기면서 반투명 카드와 배경 그라데이션을 그대로 살리려고 했는데, 속성은 분명히 있고 에러도 안 나는데 결과물에는 아무 변화가 없었습니다.

값을 바꿔 가며 몇 번을 다시 만들어도 똑같아서 처음엔 제 코드를 의심했는데, 생성된 파일을 풀어 보니 XML 에 아예 안 들어가 있었습니다.


라이브러리가 못 하는 걸 하려는 게 아니라 포맷에는 있는데 라이브러리가 안 써 주는 상황이라, 그 부분만 직접 넣어 주면 되는 문제였습니다.


- fill.transparency값을 넣어도 XML 에 반영되지 않는다

- 파워포인트 파일은 zip + XML 이라 직접 열어 확인할 수 있다

- 투명도는 <a:alpha> 한 줄로 들어간다

- 그라데이션은 <a:gradFill> 을 통째로 만들어 넣는다

- 방사형은 <a:path path="circle"> 로 지정한다


1. 안 먹는 걸 먼저 확인한다

shape.fill.transparency = 0.5 같은 코드는 예외 없이 지나가는데, 저장된 파일을 열어 보면 도형에 투명도가 없습니다.

내 코드가 틀린 건지 라이브러리가 안 쓰는 건지부터 갈라야 하는데, pptx 파일이 zip 이라 압축을 풀면 바로 확인할 수 있습니다.

슬라이드 XML 에서 해당 도형을 찾아 <a:alpha> 가 있는지 보면 끝이고, 없으면 라이브러리 쪽 문제라 다른 길을 찾으면 됩니다.



2. 투명도는 색 안에 들어간다

파워포인트에서 투명도는 도형 속성이 아니라 색 요소의 자식입니다.

그래서 <a:solidFill> 안의 <a:srgbClr> 를 찾아 그 밑에 <a:alpha> 를 붙이면 되고, 값은 백분율에 1000을 곱한 정수입니다.


- 50% 투명 -> <a:alpha val="50000"/>

- 완전 불투명 -> 아예 <a:alpha> 를 넣지 않음


python-pptx 는 내부적으로 lxml 을 쓰기 때문에 요소를 직접 만들어 붙이는 게 어렵지 않습니다.



3. 그라데이션은 조각을 통째로 만든다

투명도는 한 줄이면 되는데 그라데이션은 구조가 있어서, 문자열로 XML 을 만들어 파싱한 뒤 통째로 끼워 넣는 쪽이 훨씬 간단합니다.

<a:gradFill> 안에는 색이 바뀌는 지점들이 <a:gs> 로 들어가고, pos 는 0에서 100000 사이의 정수로 위치를 나타냅니다.

각 지점마다 색과 투명도를 따로 줄 수 있어서, 가운데는 진하고 바깥으로 갈수록 사라지는 형태를 만들 수 있습니다.


- pos="0" : 중심

- pos="55000" : 중간

- pos="100000" : 바깥, 여기서 alpha="0" 이면 완전히 사라진다


방향은 <a:path> 로 정하는데 path="circle" 이면 방사형이고, <a:fillToRect> 로 중심 위치를 잡습니다.

네 값을 모두 50000 으로 주면 정중앙에서 퍼져 나가는 모양이 됩니다.



4. 기존 채우기를 먼저 지운다

새 채우기를 넣기 전에 이미 있는 걸 제거하지 않으면 둘이 겹칩니다.

도형에는 <a:solidFill> 이나 <a:noFill> 이 이미 들어가 있을 수 있고, 같은 작업을 두 번 하면 <a:gradFill> 이 두 개가 되기도 합니다.


그래서 세 가지를 모두 찾아 지운 다음에 새로 넣는 게 안전합니다.


5. 넣는 위치가 중요하다

XML 은 순서를 따지기 때문에 아무 데나 붙이면 파일이 열리지 않습니다.

채우기는 테두리(<a:ln>) 보다 앞에 와야 해서, 테두리가 있으면 그 앞에 넣고 없으면 맨 뒤에 붙이면 됩니다.

이 순서를 어기면 파워포인트가 복구 대화상자를 띄우는데, 원인 메시지가 친절하지 않아서 한참 헤매게 됩니다.


6. 정리

라이브러리에 있는 속성이라고 해서 다 동작하는 건 아니고, 특히 파일 포맷이 큰 경우에는 구현이 안 된 자리가 남아 있습니다.

정리하면 이렇습니다.


- 안 먹으면 생성된 파일을 풀어서 먼저 확인한다

- pptx 는 zip + XML 이라 확인 비용이 낮다

- 투명도는 색 요소 밑에 <a:alpha> 를 붙인다

- 그라데이션은 문자열로 만들어 통째로 삽입한다

- 넣기 전에 기존 채우기를 지우고, 테두리보다 앞에 넣는다


포맷을 직접 건드리는 건 부담스러워 보이지만 파워포인트 XML 은 태그 이름이 직관적이라, 한 번 열어 보면 나머지는 검색으로 따라갈 수 있습니다.

여기까지 python-pptx 에서 투명도와 그라데이션을 넣는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!

반응형