PDF 메타데이터 제거, '완전 삭제'와 '빈 값'은 다르다
"메타데이터를 제거했다"는 문구를 보면 파일 안에서 그 정보가 통째로 사라졌다고 생각하기 쉽습니다. 하지만 PDF 내부 구조와 이를 다루는 라이브러리의 동작 방식을 보면, "제거"라는 단어가 가리키는 실제 동작은 필드마다 다릅니다. 어떤 필드는 값이 빈 문자열로 바뀔 뿐 필드 자체는 파일 안에 남아 있고, 어떤 필드는 키 자체가 파일 구조에서 사라집니다. PDF 메타데이터 제거기의 실제 코드를 기준으로 이 비대칭이 왜 생기는지, 그리고 그 차이가 실무에서 왜 중요한지 정리했습니다.
1. PDF 메타데이터는 어디에 저장되는가
PDF 문서 정보는 파일 구조상 "Info Dictionary"라는 키-값 사전에 담깁니다. 여기엔 제목(Title), 작성자(Author), 주제(Subject), 키워드(Keywords), 작성 프로그램(Creator), PDF 생성기(Producer), 작성일(CreationDate), 수정일(ModDate) 8개 표준 필드가 들어갑니다. 이 사전은 PDF 파일을 열어보는 어떤 뷰어에서도 "문서 속성" 메뉴로 확인할 수 있는 정보이며, 브라우저에서 pdf-lib 같은 라이브러리로 PDF를 다룰 때도 이 사전을 직접 조작하게 됩니다.
2. 왜 "지운다"는 동작이 필드마다 다른가
pdf-lib은 Title·Author·Subject·Keywords·Creator·Producer 6개 필드에 대해서는 setTitle(), setAuthor() 같은 "설정" 함수만 제공합니다. 이 함수들은 값을 새로 쓰는 용도로 설계되어 있어서, "지운다"는 요청은 사실상 "빈 문자열로 다시 쓴다"로 처리됩니다. 반면 CreationDate와 ModDate 2개 필드는 별도의 setter가 없고, Info Dictionary 자체에서 getInfoDict().delete() 메서드로 키를 직접 삭제하는 방식이 가능합니다. 즉 라이브러리가 제공하는 API의 형태 자체가 필드마다 다르기 때문에, "제거" 버튼 하나를 눌러도 내부적으로는 두 가지 서로 다른 동작이 섞여서 실행됩니다.
doc.setTitle('')·doc.setAuthor('')·doc.setSubject('')·doc.setKeywords([''])·doc.setCreator('')·doc.setProducer('') — 6개 필드는 빈 값으로 덮어쓰기. infoDict.delete(PDFName.of('CreationDate'))·infoDict.delete(PDFName.of('ModDate')) — 2개 필드는 키 자체를 삭제.
3. 결과 파일에서 실제로 무엇이 남는가
체크박스를 선택하고 제거를 실행한 뒤 결과 PDF를 다른 뷰어로 열어보면, 제목·작성자 같은 필드는 "값 없음"이 아니라 "빈 문자열"로 표시될 수 있습니다. 일부 PDF 뷰어나 파일 속성 검사 도구는 이 둘을 구분해서 보여주기 때문에, 사용자가 "완전히 지워졌다"고 기대했는데 필드 자체는 여전히 존재하는 것으로 인식될 여지가 있습니다. 반면 작성일·수정일은 아예 필드가 존재하지 않는 상태가 되므로, 같은 도구·같은 버튼으로 처리해도 검사 결과가 다르게 나올 수 있습니다.
| 필드 | 처리 방식 | 결과 파일에서의 상태 |
|---|---|---|
| Title / Author / Subject / Keywords / Creator / Producer (6개) | 빈 문자열로 덮어쓰기 | 키는 존재, 값은 공백 |
| CreationDate / ModDate (2개) | Info Dictionary에서 키 삭제 | 키 자체가 없음 |
4. 이 차이가 실무에서 중요한 이유
회사 문서를 외부에 배포하기 전 메타데이터를 지우는 목적은 대체로 "이 파일이 누구 컴퓨터의 어떤 프로그램으로, 언제 만들어졌는지"를 감추기 위해서입니다. 값이 빈 문자열이든 키가 아예 없든 사람이 "문서 속성" 창을 열어 봤을 때 눈에 보이는 결과는 사실상 같습니다 — 어느 쪽이든 정보는 노출되지 않습니다. 다만 파일을 프로그램적으로 분석하는 스크립트(예: 특정 키의 존재 여부만 검사하는 자동화 도구)를 쓴다면 "키가 있는데 비어있다"와 "키가 없다"는 다르게 감지될 수 있으므로, 엄격한 검증이 필요한 상황이라면 이 비대칭을 알아두는 것이 좋습니다.
5. 처리 후 검증하는 방법
어떤 방식으로 지워졌든, 결과가 실제로 원하는 대로 적용됐는지 확인하는 가장 확실한 방법은 결과 PDF를 같은 도구에 다시 업로드해 "현재 메타데이터" 표를 보는 것입니다. 이 도구는 값이 있는 필드만 체크박스를 활성화하므로, 재업로드 시 8개 필드 모두 값이 비어 있거나 표시되지 않으면 정상적으로 처리된 것입니다. PDF 파일 자체의 다른 구조 정보까지 함께 점검하고 싶다면 PDF 메타데이터 뷰어나 PDF 크기 분석기로 교차 확인할 수 있습니다.
자주 묻는 질문
Q. "빈 문자열로 덮어쓰기"와 "키 삭제"는 결과 파일 크기에도 차이를 만드나요?
거의 무시할 수 있는 수준입니다. 두 방식 모두 원래 값보다 훨씬 짧은 데이터로 바뀌므로 파일 크기는 오히려 약간 줄어듭니다. 어느 방식이든 육안으로 체감할 만한 크기 차이는 없습니다.
Q. 왜 8개 필드를 전부 키 삭제 방식으로 통일하지 않나요?
pdf-lib 라이브러리가 Title·Author 등 6개 필드에는 값을 설정하는 함수만 제공하고 키를 직접 삭제하는 함수를 제공하지 않기 때문입니다. Info Dictionary를 저수준으로 직접 조작하면 가능하지만, 이 도구는 라이브러리가 제공하는 표준 API를 그대로 사용합니다.
Q. XMP 메타데이터도 같이 지워지나요?
이 도구는 Info Dictionary만 다룹니다. PDF에는 이와 별도로 XMP(Extensible Metadata Platform)라는 XML 기반 메타데이터가 함께 저장되는 경우가 있는데, Info Dictionary를 지워도 XMP 스트림에 동일한 정보가 남아 있을 수 있습니다. 민감한 정보가 XMP에도 있는지 걱정된다면 다른 파일 속성 도구로 별도 확인이 필요합니다.
Q. 체크하지 않은 필드는 어떻게 되나요?
원본 값 그대로 유지됩니다. 저장 로직이 "체크 해제된 필드는 원래 값을 그대로 다시 써서" 결과 파일에 넣기 때문에, 선택하지 않은 필드는 제거 전후로 변화가 없습니다.