2011-08-21 4 views
2

PDFCreator 0.9.x에서 생성 된 PDF 파일을 렌더링하는 중. 문자 매핑에 오류가 있음을 발견했습니다. 이제 PDF 파일의 오류는 궁금해 할 사항이 아닙니다. Acrobat은 오류가있는 PDF 파일을 렌더링하는 데 궁금해하기 때문에 많은 PDF 생성기가 PDF 표준을 완벽하게 준수하지 않는 PDF를 만듭니다.PDF 글꼴 매핑 오류

나는 작은 예제 파일을 만들 trief : http://test.continuit.nl/temp/Document.pdf

단일 페이지는 TJ 명령을 사용하여 하나의 그림 문자 (대문자 A)를 렌더링 (스트림 5 0 OBJ 참조). 선택된 글꼴 (7 0 obj)에는 하나의 문자 모양이 포함 된 글꼴이 들어 있습니다. 여태까지는 그런대로 잘됐다. char는 char # 1에 의해 참조됩니다. 글꼴의 인코딩이 주어지면 차이 부분이 포함됩니다 : [1/A]. 그러므로 char 1 -> character/A. 이제 임베디드 하위 집합 글꼴에는 65 문자 (예 : 대문자)에 글리프가없는 cmap이 있습니다. 글꼴의 cmap 섹션은 PDF 파일의 글꼴 -> 인코딩 -> 차이 배열에서 문자를 정확히 정의합니다.

문자 매핑/인코딩이 두 번 완료된 것처럼 보입니다. PDFCreator 0.9.x의 파일 만 영향을받는 것 같습니다.

제 질문은 :이 문제가 해결 되었습니까? (또는 실수로 PDF를 수정 했습니까?) 렌더링 문제를 해결하기 위해이 상황을 감지하기 위해 무엇을해야합니까?

참고 : 나는 (플래그 비트 (3) 글꼴에 상징적 인 트루 타입 글꼴 켜져 있는지 발언이 인 ISO32000 파일에서

솔루션

..이 PDF 파일을 렌더링 할 수 있어야합니까 descriptor) 인코딩은 허용되지 않으므로 간단한 1on1 인코딩을 항상 사용하여 무시해야합니다. 그래서 모두 상징적 글꼴이라면, 나는 Encoding 객체를 모두 무시하고 이것이 문제를 해결합니다.

+0

파일을 렌더링 할 때 무엇을할까요? – userx

+0

@userx : 내 자신의 PDF 렌더러가 Delphi로 작성되었습니다. PDF를 메모리에서 GDI 장치로 렌더링합니다 (일반적으로 비트 맵이지만 프린터 또는 기타 GDI 장치 컨텍스트 일 ​​수도 있음). –

답변

2

첫 번째 요점은 파일이 Acrobat에서 제대로 열리고 렌더링되므로 파일이 정확한지 확인하는 것입니다. 사실 그것은 다양한 PDF 소비자에서 올바르게 열리고 렌더링되기 때문에 사실입니다.

해당 글꼴은 트루 타입 글꼴이므로 실제로 '인코딩'에는 두 가지 종류가 있습니다. 먼저 PDF/PostScript 인코딩이 있습니다. 문자 코드를 문자 모양의 이름으로 매핑합니다. 귀하의 경우에는 문자 코드 1을 글리프 이름/A에 매핑합니다.

PostScript 글꼴에서 우리는 CharStrings 사전에서 이름/A를 찾아 보았습니다. 그러면 우리는 그 문자 설명을 우리에게 줄 것입니다. 하지만 트루 타입 글꼴은 상황이 다릅니다.

"A 트루 타입 글꼴 프로그램에 내장 된 인코딩이 내부 데이터를 이용하여 설명을 문자 모양 문자 코드에서 직접 매핑 :

당신은 그 내용의 1.7 PDF 참조 설명서의 페이지 (430)에이를 찾을 수 있습니다 "cmap"이라고 불리는 구조 (5.6.4 절. "CMaps"에서 설명 된 CMap과 혼동해서는 안됩니다.)

나는 귀하의 경우 단순히 CMAP 서브 테이블에서 직접 문자 코드 (0x01)를 사용해야한다고 생각합니다. 그러면 GID가 36이됩니다.

+0

첫 번째 사항에 대해 : 1 년 동안 PDF 렌더러를 작성한 후에 Acrobat에 오류가있는 PDF 렌더링을 지원하는 것이 매우 훌륭합니다.PDF 객체의 키가 대부분 누락되었습니다. 특히 글꼴 처리에서 이러한 문제가 발생합니다. –

+0

내가 보는 것은 마지막 단락과 동일한 마이너스입니다 : 내용에서 char 0x01을 그리는 commando입니다. Encoding 폰트가 주어진다면 Postscript char/A입니다. TT 글꼴에는 POST 섹션이 채워지지 않습니다. TT 글꼴 (typ0이 아닌)이있는 다른 PDF와 마찬가지로 TT cmap을 사용하고 Acrobat 변환 테이블 양식 이름이 유니 코드 코드 인 경우 문자 65를 조회해야합니다. 대부분의 PDF는 올바르게 작동하지만 PDFCreator로 만든 onse 만 (지금까지 볼 수있는 한) 필요하지 않습니다. TT 글꼴의 Mac 및 MS cmap은 모두 동일한 매핑을 사용합니다. 다른 사람들은 실제로 PDF에서 인코딩을 필요로합니다. –

+0

참고로 PDF 1.7 표준 431쪽에는 Endoding Dictionary와 Differences를 먼저 사용해야한다고 나와 있으며 (3, 1) "cmap"하위 테이블 (Microsoft 유니 코드)이있는 경우 먼저 PS 이름에 매핑합니다 , 유니 코드 값으로 변환 한 다음 (3,1) 서브 테이블을 사용하십시오. 이는 렌더러가 작동하지 않고 잘못된 결과를 산출하는 것과 정확히 같습니다 (PDFCreateor 0.9.x 파일의 경우). –