PDF 문서와 Aspose.PDF 라이브러리에서 작업할 때, 좌표계는 페이지의 왼쪽 하단 모서리에서 시작됩니다.
점 (0,0)은 왼쪽 하단 모서리에 해당합니다. 이는 이미지, 텍스트 또는 기타 객체를 배치할 때 Y축이 위쪽으로 증가한다는 점을 기억하는 것이 중요합니다. 이는 다른 좌표계와는 다릅니다.
각 페이지는 고유한 좌표계를 가지고 있습니다. 좌표는 플랫폼 독립적인 단위로 지정됩니다. PDF 사양에 따르면 PDF는 여러 좌표 공간에서 작동합니다.
장치 공간
각 출력 장치 — 디스플레이, 프린터 등은 이미지를 렌더링하기 위해 고유한 좌표계를 사용합니다.
이 시스템을 장치 공간이라고 합니다. 원점(점 0,0)은 장치에 따라 다른 위치에 있을 수 있습니다.
또한, 좌표 축의 방향이 다를 수 있습니다: 수직 Y축은 아래에서 위로 증가하거나 위에서 아래로 증가할 수 있습니다.
장치 해상도도 다양합니다. 디스플레이는 종종 인치당 72 또는 96 픽셀의 해상도를 가지며, 프린터는 300, 600 또는 그 이상의 점을 가질 수 있습니다.
일부 장치는 수평 및 수직 축에서 서로 다른 해상도를 가질 수도 있습니다.
그래픽 요소가 장치 공간 좌표로 직접 지정되면 결과는 특정 장치의 특성에 따라 달라집니다.
이로 인해 왜곡된 렌더링이 발생할 수 있습니다: 동일한 객체가 화면과 인쇄물에서 다르게 나타날 수 있습니다.
예를 들어, 72 ppi 해상도의 디스플레이 좌표로 지정된 8인치 길이의 선은 600 dpi 프린터에서 인쇄할 때 1인치 미만을 차지합니다.
사용자 공간
이러한 문제를 피하기 위해 PDF는 출력 장치에 관계없이 일관된 그래픽 렌더링을 보장하는 장치 독립적인 좌표계(사용자 공간)를 사용합니다.
페이지 렌더링 중에 콘텐츠는 출력 장치의 특정 기능을 고려하여 사용자 공간에서 장치 공간으로 변환됩니다.
문서의 각 페이지는 고유한 사용자 공간 좌표계를 가지고 있습니다. 두 축을 따라 한 단위의 길이는 1/72 인치와 같습니다.
UserUnit을 설정하여 측정 단위를 변경할 수 있으며, 기본적으로 1과 같습니다. 이 값은 페이지 객체의 UserUnit 속성을 사용하여 지정할 수 있습니다.
UserUnit은 1/72 인치에 대한 배수 역할을 합니다.
사용자 공간에서 장치 공간으로의 변환은 현재 변환 행렬(CTM)에 의해 정의됩니다.
이미지 1. 좌표 공간의 행렬 변환. ISO 32000-2:2020 사양에서 가져옴
PDF 연산자를 사용하여 페이지 콘텐츠를 생성하는 경우, Aspose.Pdf.ConcatenateMatrix 연산자를 사용하여 CTM(현재 변환 행렬)을 수정할 수 있습니다. 이 연산자는 현재 행렬과 제공한 행렬을 연결합니다.
이를 통해 렌더링된 콘텐츠의 회전, 변환 및 스케일링을 수행할 수 있습니다.
이미지 2. 장치 공간으로의 변환. ISO 32000-2:2020 사양에서 가져옴
사용자 공간과 장치 공간 외에도 PDF는 각각 특정 목적을 수행하는 여러 다른 좌표계를 사용합니다:
텍스트 공간
텍스트는 고유한 좌표계인 텍스트 공간에 배치됩니다. 텍스트 공간에서 사용자 공간으로의 변환은 전용 텍스트 행렬과 다양한 텍스트 렌더링 설정을 사용하여 수행됩니다.
글리프 공간
폰트 문자(글리프)는 글리프 공간에서 정의됩니다. 이 공간은 폰트 행렬을 통해 텍스트 공간으로 변환됩니다.
대부분의 폰트에서는 1000 글리프 공간 단위 = 1 텍스트 공간 단위의 비율이 사용됩니다.
Type 3 폰트와 같은 일부 폰트에서는 이 행렬이 명시적으로 정의됩니다.
이미지 공간
래스터 이미지는 고유한 이미지 공간에서 정의됩니다. 이 공간은 항상 자동으로 사용자 공간으로 변환됩니다:
이미지는 실제 해상도와 관계없이 너비와 높이가 1 단위로 간주됩니다.
이미지를 올바르게 표시하려면 변환 행렬(스케일링, 회전)을 수정하여 그 크기와 위치를 설정합니다.
폼 공간
폼(Form XObjects)은 그래픽 요소로 삽입할 수 있는 독립적인 콘텐츠 조각입니다.
각 폼은 고유한 폼 공간에서 정의되며, 이후 폼 행렬을 사용하여 사용자 공간으로 변환됩니다.
이미지 3. 좌표 공간 간의 관계. ISO 32000-2:2020 사양에서 가져옴
변환 행렬
이 행렬은 페이지의 객체에 대한 스케일링, 회전, 변환, 전단 및 반사를 수행할 수 있게 해줍니다.
이것은 3×3 2차원 행렬이지만 PDF에서는 6개의 숫자 매개변수만 사용됩니다: [a b c d e f].
이 행렬은 변환된 공간의 각 점 (x, y)에 다음 공식을 사용하여 적용됩니다:
x’ = a * x + c * y + e
y’ = b * x + d * y + f
이미지 4. 좌표 변환 방정식. ISO 32000-2:2020 사양에서 가져옴
좌표 변환 공식 — ISO 32000-2:2020 사양에서 가져옴.
행렬 요소의 값에 따라 다양한 유형의 변환을 정의할 수 있습니다:
변환: [1 0 0 1 e f] — 객체를 X축을 따라 e 단위, Y축을 따라 f 단위 이동합니다.
스케일링: [a 0 0 d 0 0] — 객체를 X축을 따라 a 배, Y축을 따라 d 배로 스케일합니다.
반사: X축을 가로질러 [1 0 0 -1 0 0], Y축을 가로질러 [-1 0 0 1 0 0]
변환 행렬 설정 예시:
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NETvarmatrix=newAspose.Pdf.Matrix(newdouble[]{a,b,c,d,e,f});page.Contents.Add(newAspose.Pdf.Operators.ConcatenateMatrix(matrix));
예제 1에서는 페이지의 모서리 좌표에서 텍스트를 렌더링하려고 하면 원점에 있는 텍스트만 보이는 것을 볼 수 있습니다.
나머지 텍스트는 보이는 영역 밖으로 떨어져 잘립니다.
이미지 5. 예제 1 실행 결과.
예제 2에서는 좌표계를 스케일링하고 페이지의 중앙으로 이동합니다.
이미지 6. 예제 2 실행 결과.
Aspose.PDF에서 좌표계 및 위치 지정 이해하기
Aspose.PDF로 작업할 때, 위치 지정을 위해 사용되는 객체와 해당 좌표계 간의 차이를 이해하는 것이 중요합니다. 아래는 주요 객체(TextFragment, TextStamp, FloatingBox, Rectangle)와 그 사용 사례, 장단점에 대한 자세한 설명입니다.
TextFragment
좌표계: 절대 위치 지정(왼쪽 하단 원점).
설명: TextFragment 클래스는 절대 좌표를 사용하여 페이지의 특정 위치에 텍스트를 추가할 수 있게 해줍니다.
장점:
정확한 위치에 텍스트를 추가하는 데 간단하고 효율적입니다.
TextStamp에 비해 가벼운 작업입니다.
단점:
회전이나 스케일링과 같은 고급 변환을 지원하지 않습니다.
사용 사례: 추가 복잡성 없이 페이지의 특정 위치에 텍스트를 추가해야 할 때 사용합니다.
TextStamp
좌표계: 절대 위치 지정(왼쪽 하단 원점).
설명: TextStamp 클래스는 페이지에 스탬프로 텍스트를 추가합니다. 내부적으로 페이지의 리소스에 폼을 생성하므로 TextFragment보다 더 복잡한 작업입니다.
장점:
회전, 스케일링 및 불투명도와 같은 고급 변환을 지원합니다.
워터마크나 반복 텍스트를 추가하는 데 이상적입니다.
단점:
TextFragment에 비해 더 많은 리소스를 소모합니다.
구성하기가 약간 더 복잡합니다.
사용 사례: 변환이나 반복 사용이 필요한 워터마크, 헤더 또는 바닥글을 추가할 때 사용합니다.
FloatingBox
좌표계: 상대 위치 지정(페이지 여백 기준).
설명: FloatingBox 클래스는 텍스트나 기타 요소를 담을 수 있는 컨테이너입니다. 그 위치는 페이지 여백을 기준으로 정의됩니다.
장점:
페이지 레이아웃에 따라 요소를 쉽게 배치할 수 있습니다.
콘텐츠의 동적 크기 조정 및 줄 바꿈을 지원합니다.
단점:
정밀한 픽셀 단위 배치에는 적합하지 않습니다.
복잡한 레이아웃을 위해 추가 조정이 필요합니다.
사용 사례: 콘텐츠가 동적으로 흐르는 레이아웃을 생성할 때 사용합니다. 예: 헤더, 바닥글 또는 사이드바.
Rectangle
좌표계: 절대 위치 지정(왼쪽 하단 원점).
설명: Rectangle 클래스는 페이지에 영역이나 도형을 그리는 데 사용됩니다. 또한 특정 직사각형 영역 내에서 텍스트를 검색하기 위해 TextFragmentAbsorber와 함께 사용할 수 있습니다.
장점:
프레임이나 강조 표시와 같은 그래픽 요소를 그리는 데 유용합니다.
텍스트나 이미지와 같은 다른 요소와 결합할 수 있습니다.
단점:
직사각형 모양으로 제한됩니다.
다른 콘텐츠와 통합하기 위해 추가 단계가 필요합니다.
사용 사례:
요소 주위에 프레임을 그리거나 페이지의 영역을 강조 표시하는 데 사용합니다.
특정 영역 내에서 텍스트를 검색하기 위해 TextFragmentAbsorber와 함께 사용합니다.