PDFlibPas는 일본어와 중국어 텍스트를 페이지 아래로 그립니다. SetVerticalWritingMode가 세로쓰기를 켜면 일반적인 DrawText 호출이 아래 방향으로 진행되며, GetVerticalWritingMode가 현재 상태를 보고합니다. 이 기능이 있기 전에는 텍스트를 세로로 설정한다는 것은 모든 문자를 손으로 배치하고 간격이 옳아 보이길 바라는 것이었습니다
세로쓰기는 90도 회전된 가로 텍스트가 아닙니다. 문자는 똑바로 선 채로 진행 방향이 가로가 아닌 아래로 흐르고, 여러 문자는 모양 자체가 완전히 바뀝니다. 이 부분이 자연스럽게 읽히는 문서와 일본어 독자가 기계 번역된 것으로 즉시 알아보는 문서를 가릅니다
PDF 내부에서 무엇이 바뀌는가
이 방식으로 그려진 텍스트는 폰트 자체의 세로쓰기 메트릭을 담은 세로쓰기 모드의 Type0 폰트를 거칩니다. 이것은 양 방향으로 중요합니다. 리더가 각 문자를 균일한 스텝이 아니라 디자이너가 의도한 거리만큼 진행시키므로, 단은 서체가 그려진 리듬을 갖습니다. 그리고 텍스트를 복사해 내면 원래 문자가 돌아옵니다. 세로쓰기 실행이 적절한 매핑을 가진 진짜 텍스트이지 위치가 지정된 글리프의 나열이 아니기 때문입니다
자체 세로쓰기 메트릭을 담지 않은 서체는 문자당 1em씩 진행하며, 이는 리더가 기본값으로 할 일입니다. 이 폴백은 알아둘 가치가 있습니다. 제대로 된 CJK 서체로는 올바르게 렌더링되는 문서가 약간의 가나를 우연히 포함한 라틴 서체에서는 기계적으로 배치된 것처럼 보이는 차이가 바로 이것이기 때문입니다
var
Lib: TPDFlib;
H: Double;
begin
Lib := TPDFlib.Create;
try
Lib.SetOrigin(1);
Lib.AddTrueTypeFont('MS Mincho', 1); // 1 = embed the face
Lib.SetTextSize(12);
Lib.SetVerticalWritingMode(1); // ordinary DrawText now runs down
H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
Lib.DrawText(480, 72, '第三章 保守点検');
Lib.SetVerticalWritingMode(0); // back to horizontal
Lib.DrawText(72, 72 + H, 'Chapter 3');
Lib.SaveToFile('manual-ja.pdf');
finally
Lib.Free;
end;
end;
세로쓰기에서 괄호가 왜 이상해 보이는가
괄호는 두 형태를 가지며 그중 하나만 단에 속하기 때문입니다. 괄호, 장음 기호, 작은 가나는 텍스트가 페이지를 따라 아래로 흐를 때 다르게 그려집니다. 괄호는 단을 가로지르며 눕는 대신 단을 따라 서도록 회전하고, 장음 기호는 세로 획이 됩니다. 가로 형태를 세로 단에 그리면 모두가 옆으로 누운 채가 됩니다
PDFlibPas는 폰트 자체의 세로쓰기 기능에서 형태를 가져오므로, 각 서체는 문자에서 추측한 치환이 아니라 디자이너가 그린 것을 제공합니다. 이 구분은 정확성에 중요합니다. 추측된 치환 테이블은 흔한 경우에 맞고 문자를 다르게 다루는 서체에서는 틀리며, 세로쓰기 형태 이름을 가지지 않은 서체는 결코 요청하지 않은 테이블을 강제로 거치는 대신 이전과 정확히 같이 그려집니다
GetVerticalTextHeight는 실제로 그려질 형태를 측정하므로, 문자가 모양을 바꾸는 단도 올바르게 측정됩니다. 가로 형태를 측정하고 세로 형태를 그리는 것이 단이 박스를 몇 문자만큼 넘쳐나게 하는 고전적인 원인입니다
모드를 바꾸지 않고 단일 실행 그리기
DrawVerticalText는 위치, 폰트 이름, 크기, 텍스트를 받아 단일 실행을 세로로 그리며 쓰기 모드는 그대로 둡니다. 가로 문서 안의 세로쓰기 예외에 사용하십시오. 책등 레이블, 도장, 이름의 단일 열이 그 경우이며, 이런 경우 매 호출마다 전역 모드를 켜고 끄는 것은 작업이 감당해야 할 상태보다 많습니다
하나의 서체에서 가로 형태와 세로 형태는 내부적으로 분리되어 유지되므로, 페이지는 어느 한쪽이 다른 쪽을 방해하지 않으면서 두 가지 모두를 담을 수 있습니다. 이것이 혼합 페이지를 실용적으로 만듭니다. 세로쓰기 본문과 가로쓰기 머리말을 가진 일본어 책 페이지나, 가로쓰기 상세 라인 위에 세로쓰기 제목을 둔 중국어 증명서가 그 예입니다
// One vertical run inside an otherwise horizontal page
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// The horizontal text around it is unaffected
Lib.DrawText(72, 96, 'Maintenance inspection record');
무엇보다 먼저 폰트를 올바르게 갖추기
세로쓰기는 전적으로 서체에 달립니다. 적절한 세로쓰기 메트릭과 세로쓰기 기능을 가진 CJK 폰트는 추가 작업 없이 올바른 출력을 만들어냅니다. 그것들이 없는 폰트는 똑바로 선 문자가 한 번에 1em씩 진행하며 어떤 모양 변화도 없는 결과를 냅니다. 세로쓰기 텍스트가 미묘하게 틀려 보인다면 코드보다 먼저 폰트를 조사하십시오
임베딩은 일반적인 규칙과 비용을 따릅니다. 풀 CJK 서체는 크므로, 어디로든 향하는 문서에는 서브세팅이 선택이 아닙니다. PDF 파일 크기 최적화와 폰트 서브세팅에 관한 글이 기대할 것을 다루고, 기존 PDF에 누락된 폰트 임베드하기 산책문은 세로쓰기 문서가 폰트 없이 도착하는 복구 사례를 다룹니다
세로쓰기 텍스트가 여전히 여러분의 레이아웃 결정을 필요로 하는 곳
단 순서입니다. 일본어 세로쓰기 텍스트는 단 기준으로 오른쪽에서 왼쪽으로 진행하므로, 2단 페이지는 오른쪽 가장자리에서 시작하며 어떤 쓰기 모드 설정도 텍스트에서 그것을 추론할 수 없습니다. 전체가 오른쪽에서 왼쪽으로 읽히는 문서의 페이지 순서와 후리가나, 각주, 그림 캡션이 자리하는 곳에도 같은 것이 적용됩니다
라이브러리가 보장하는 것은 각 실행이 올바르게 설정된다는 것입니다. 올바른 형태, 올바른 진행, 추출 가능한 텍스트입니다. 실행들이 페이지의 어디에 가는지는 레이아웃 문제이며, 데이터로부터 조립된 문서의 경우 텍스트 검색과 페이지 요소 열거 산책문이 페이지에 내려앉은 것이 의도한 것인지 사후에 검증하는 데 유용합니다
PDFlibPas는 Delphi, C++Builder, Lazarus를 위한 네이티브 Pascal PDF 라이브러리이며, CJK 세로쓰기는 애드온이 아니라 그리기 API의 일부입니다. 텍스트와 폰트 기능 목록은 PDFlibPas 제품 페이지를 보십시오