PDF에서 가져온 사진이 페이지에 표시된 사진과 다른 이유는 무엇인가요?

투명도가 있는 이미지는 메인 이미지와 소프트 마스크로 별도로 저장할 수 있습니다. 다음으로 Pillow를 사용하여 RGBA PNG를 구성하고, 메모리 내 PDF를 삽입하고, 기본 이미지와 SMask를 확보합니다. 기본 이미지 바이트를 추출하는 것은 완전한 투명도 효과를 얻는 것과 같지 않으며 페이지의 모든 표시 인스턴스를 재구성하는 것과도 같지 않습니다.

PDF에서 추출한 이미지는 페이지에서 보는 것과 다르게 보이는 경우가 많습니다. 완전히 검은색이거나 크기가 잘못되었거나 배경이나 워터마크가 누락되어 있습니다. 문제는 일반적으로 코드 자체에 있는 것이 아니라 PDF 내의 원본 이미지 개체를 읽고 페이지를 렌더링할 때 구성 지침이 누락된다는 사실에 있습니다.

이 문서는 PDF 이미지를 구문 분석하기 위해 스크립트를 사용해야 하는 개발자 및 문서 처리자를 위해 작성되었습니다. OCR 전처리, 콘텐츠 재구성 등의 시나리오에 적합합니다. 읽고 나면 원본 개체와 페이지 표시의 차이를 이해할 수 있고, SMask(소프트 마스크)로 인해 투명 영역이 손실되는 이유를 알 수 있으며, 합성 샘플을 사용한 일련의 자체 테스트 방법을 마스터할 수 있습니다.

이 기사에서는 합성 샘플을 사용하여 처리 방법을 보여줍니다. 코드는 격리된 환경에서 예제로 확인되었으며 모든 실제 파일이나 제품 성능을 보장하지는 않습니다. 중요한 서류를 처리하기 전, 원본을 보관하시고, 본문에 기재된 경계 및 허용 항목에 따라 검토하시기 바랍니다.

PDF 이미지 추출 결과가 페이지와 일치하지 않습니까? 한 문장 결론

추출된 기본 이미지 바이트는 페이지의 전체 효과와 동일하지 않습니다. SMask는 동시에 처리되어야 하며 리더의 실제 렌더링 결과는 수용 벤치마크로 사용됩니다.

당신의 상황권장 사례이유
추출 결과는 단색 직사각형이 되고, 투명한 부분은 검은색이나 흰색이 됩니다.smask_xref가 0인지 확인하고 SMask를 알파 채널로 기본 이미지에 병합합니다.투명도가 있는 이미지는 메인 이미지와 소프트 마스크로 별도로 저장할 수 있습니다. 기본 이미지만 추출하면 투명도 정보가 손실됩니다.
추출되는 것은 전체 큰 이미지이며, 그 중 일부만 페이지에 표시됩니다.CTM 매트릭스 및 /BBox를 읽고 디스플레이 영역에 따라 자릅니다.동일한 베이스맵은 여러 페이지에서 재사용될 수 있으며 각 페이지는 부분 영역만 표시합니다.
이미지 방향이 바뀌거나 변형되었습니다.기하학적 보정을 위한 매트릭스 매개변수를 읽고 텍스트와 면을 수동으로 확인합니다.변환 행렬에는 음수 스케일링 또는 균일하지 않은 변환이 포함될 수 있습니다.
추출에 성공했지만 페이지를 볼 수 없습니다OCG 상태를 쿼리하고 CropBox와 비교이미지는 선택적 콘텐츠 그룹이나 자르기 영역 외부에 의해 숨겨질 수 있습니다.
이미지가 흐리거나 해상도가 낮습니다.DPI 메타데이터를 기록하고 낮은 품질로 표시하고 필요한 경우 소스 파일을 다시 검색합니다.원본 삽입 이미지 자체가 저해상도 축소판일 수 있습니다.

원본 개체와 렌더링 파이프라인의 차이점

PDF 파일은 자원 창고처럼 구성됩니다. `Document.extract_image(xref)` 이 방법은 창고에서 부품을 그대로 꺼내는 것입니다. 또한 페이지의 표시는 변형 행렬(CTM) 크기 조정, 클리핑 경로(Clip Path) 자르기, 투명도 그룹(Transparency Group) 혼합, 소프트 마스크(Soft Mask) 오버레이 등 여러 프로세스를 거쳐야 합니다.

가장 일반적인 차이점은 SMask에서 비롯됩니다. 투명도 채널이 있는 많은 PNG는 PDF 내부에서 RGB 이미지 스트림과 별도의 회색 마스크 스트림이라는 두 부분으로 분할됩니다. 기본 이미지만 추출하고 연관된 SMask 객체를 삭제하면 투명도가 없는 직사각형이 생기고 원래 투명했던 영역은 검은색이나 흰색이 됩니다.

또한 볼륨을 절약하기 위해 동일한 고해상도 기본 맵을 여러 페이지에서 재사용할 수 있으며 각 페이지는 서로 다른 /BBox 및 행렬을 통해 일부만 표시합니다. 직접 추출하면 사용자에게 보이는 잘린 조각이 아닌 완전한 큰 이미지가 생성됩니다. "보이는 것이 얻는 것과 다르다"는 것은 교환 형식인 PDF의 고유한 특성이며 구문 분석 라이브러리의 결함이 아닙니다.

아래 표에서는 두 가지 관점을 비교합니다.

📊 핵심 비교

대비 치수원본 객체를 직접 추출페이지 렌더링 결과
콘텐츠 받기메인 이미지 흐름 등 자원 창고의 원본 부품합성 명령어에 의해 처리되는 시각 효과
투명성메인 이미지와 SMask는 별도로 저장할 수 있으며 수동으로 할당해야 합니다부드러운 마스크가 추가되었고, 투명 영역은 정상적으로 표시됩니다
크기와 분포기본 지도 전체 크기일 수도 있습니다CTM, /BBox 및 클리핑 경로에 의해 제한됨
재사용 현황동일한 기본 지도가 여러 페이지에 걸쳐 공유할 수 있습니다각 페이지는 자기 부분만 보여줍니다

합성 테스트 환경 및 경계 상황 처리

외부 파일에 의존하지 않고 추출 논리를 검증하려면 SMask가 포함된 합성 PDF를 만들어야 합니다. 다음 코드는 PyMuPDF를 사용하여 메모리 내에서 테스트 문서를 생성하며, 이미지 객체들은 독립적인 소프트 마스크를 가지고 있어 "아이콘이 투명한 배경을 가지지만 하단에 별도의 스트림으로 저장된다"는 실제 상황을 시뮬레이션합니다.

from io import BytesIO
from PIL import Image
import pymupdf
im = Image.new("RGBA", (16, 16), (255, 0, 0, 128))
raw = BytesIO()
im.save(raw, format="PNG")
with pymupdf.open() as doc:
    page = doc.new_page(width=100, height=100)
    page.insert_image(pymupdf.Rect(10, 10, 70, 70), stream=raw.getvalue())
    images = page.get_images(full=True)
    assert len(images) == 1
    xref, smask = images[0][:2]
    assert xref > 0 and smask > 0
    assert doc.extract_image(xref)["width"] == 16
    assert doc.extract_image(smask)["image"]

기대치의 올바른 출력: 프로그램은 이미지가 SMask와 연관되어 있음을 인식하고 주요 이미지 데이터를 성공적으로 추출할 수 있어야 합니다.

코드는 완전히 독립적이며 외부 입력 파일이 필요 없습니다. 메모리에 SMask를 탑재한 PDF를 합성한 후, 추출 논리가 마스크 연관성을 올바르게 식별하는지 검증합니다. 코드에는 두 가지 핵심 주장이 포함되어 있습니다: 하나는 추출된 데이터의 무결성을 검증하는 것이고, 다른 하나는 SMask 연관 상태의 인식을 검증하는 것입니다.

이 코드는 메타데이터 수준에서의 무결성 검증에 중점을 둡니다. 실제 제작 환경에서 smask_xref != 0를 사용할 경우, Pillow 같은 라이브러리가 doc.extract_image(smask_xref) 결과를 알파 채널로 메인 이미지에 붙여넣어야 합니다. 이 두 가지 주장은 각각 "데이터 추출 가능성"과 "마스크-연관 가시성"이라는 두 가지 핵심 계약을 포함하며, 빈 문서나 API 변경이 발생할 때 잘못된 성공을 방지할 수 있습니다.

추출 결과 수락과 수동 검토 사이의 경계

자동 추출은 시각적 확인을 완전히 대체할 수 없습니다. 아래 표는 흔한 이상 현상, 처리 전략, 그리고 수동으로 판단해야 하는 상황을 요약한 것입니다.

현상을 관찰해가능한 이유자동 처리 결정트리거 조건에 대한 수동 검토
이미지는 완전히 검은색이거나 완전히 흰색입니다SMask는 독립 실행형 이미지로 추출되며; 색 공간 디코딩 실패SMask 협회를 확인하세요; 색상 공간을 뒤로 물러보세요되돌려도 콘텐츠는 인식되지 않습니다; 스폿컬러나 기기 관련 색상이 포함됩니다
이미지 방향이 뒤바뀌거나 늘어납니다CTM 행렬은 음의 스케일링 또는 비균일 변환을 포함합니다기하학적 보정을 위한 행렬 매개변수 읽기보정 후에는 텍스트나 얼굴이 눈에 띄게 왜곡되고; 복소 벡터 클리핑 경로
여러 개의 작은 이미지를 하나의 큰 이미지로 합친다블록 코딩(타일링 패턴) 또는 스트립 저장BBox 좌표에 따라 자르거나 결합하세요관절에 뚜렷한 이음새가 있다; 논리적으로는 독립적인 의미 유닛이어야 합니다
추출은 성공했지만 페이지가 보이지 않습니다OCG(선택적 콘텐츠 그룹)에 의해 숨겨졌다; 절단 구역 밖에 위치해 있습니다쿼리 OCG 상태 필터링; CropBox와 비교해 보세요레이어 로직은 복잡하며, 예를 들어 OCMD 중첩; 동적 형태장
해상도가 매우 낮거나 흐릿합니다원본 임베딩은 저화질 썸네일입니다DPI 메타데이터를 기록하고 저품질로 표시하세요주요 차트나 텍스트는 흐릿하고 읽을 수 없으며; 소스 파일을 다시 스캔해야 합니다

"코드 데모"는 API 호출과 데이터 흐름의 연결성을 검증할 뿐, 종단 간 성능을 보장하지는 않는다는 점에 유의하세요. OCG 중첩 논리, 사용자 지정 셰이더, 암호화된 문서를 만날 때는 스크립트 출력이 참고용이며 PDF 리더의 실제 렌더링 결과를 기준으로 수용되어야 합니다.

🎯 어떤 방법이 당신에게 맞나요?

투명한 효과를 유지해야 한다면

먼저 SMask가 존재하는지 확인하고, 이를 알파 채널로 병합한 후 후속 처리를 수행합니다.

페이지에 부분적인 이미지만 필요하다면요

CTM과 /BBox를 읽고, 기본 이미지를 직접 저장하지 않고 디스플레이 영역별로 크롭하세요.

스캔된 복사본이거나 저화질 이미지에 삽입된 이미지라면

먼저 DPI 메타데이터를 기록하고 품질을 표시하세요; 핵심 내용이 불분명하면 소스 파일로 돌아가 재스캔합니다.

문서에 계층, 암호화 또는 복잡한 클리핑이 포함되어 있다면

스크립트 출력을 예비 결과로 간주하고, 궁극적으로는 PDF 리더의 렌더링 효과를 최종 참고 자료로 사용하세요.

❓ 자주 묻는 질문 (FAQ)

1. 추출된 이미지의 투명 영역이 왜 검게 변했을까요?

일반적인 이유는 투명 정보가 SMask에 저장되어 마스크를 병합하지 않고 메인 이미지만 추출하기 때문입니다.

2. 추출된 이미지가 페이지에서 보이는 것보다 훨씬 큽니다. 무슨 일이 일어나고 있는 걸까요?

동일한 기본 지도는 여러 페이지에서 재사용할 수 있으며, 각 페이지는 /BBox와 행렬을 통해 부분적인 부분만 표시합니다. 직접 추출하면 완전한 기본 지도가 나옵니다.

3. 코드가 작동한다면, 추출 결과를 직접 사용할 수 있다는 뜻인가요?

아니. 코드 데모는 API 호출과 데이터 스트림 연결성을 검증하며, 궁극적으로 리더의 실제 렌더링 결과에 대한 수용을 요구합니다.

4. 추출은 성공했지만, 페이지에는 이미지가 보이지 않았다. 그 이유는 무엇일까?

이미지는 선택적 콘텐츠 그룹(OCG)에 의해 숨겨지거나 크롭 영역 밖에 위치할 수 있어 OCG 상태 조회와 CropBox와의 비교가 가능합니다.

📝 요약

원본 이미지 객체와 PDF의 페이지 표시는 서로 다른 것이므로, 추출하기 전에 그 관계를 이해해야 합니다. SMask, 매트릭스, 클리핑 정보를 함께 처리하고 렌더링 결과와 함께 검증하면 신뢰할 수 있는 결과가 보장됩니다.

지금 경험해보세요: 원본 형식을 유지하면서 번역을 시작하려면 문서를 업로드하세요

업데이트: 2026-11-13