2011-05-15 5 views
1

PDF를 파싱 할 때 Identity-H 인코딩을 사용하여 문자열 (Tj 또는 TJ 연산자 콜백에서 팝업 됨)이 주어진 문자열을 유니 코드 (UTF8) 표현에 어떻게 매핑합니까?텍스트 검색 PDF

이 경우 CMap이 필요한 경우 어떻게 만들거나 검색하고 CMap을 적용합니까?

답변

2

아마도 글꼴 데이터 자체를 구문 분석해야 할 것입니다. Identity-H는 "바이트를 원시 글꼴 인덱스로 주어진 글꼴로 사용"한다는 것을 의미합니다. 그렇기 때문에 Identity-H를 사용할 때 반드시 글꼴을 포함해야합니다. 동일한 글꼴의 서로 다른 버전이 동일한 글리프 순서를 가질 필요는 없습니다.

여러 가지 다른 오픈 소스 프로젝트에서 이런 종류의 작업을 수행하는 방법에 대한 예제 코드가 있습니다. 예를 들어, iText (예, 저는 편향되어 있습니다).


CMap에 대해 언급했습니다. Identity-H 글꼴은 CMap을 가질 수 있지만 반드시 그렇게 할 필요는 없습니다./ToUnicode 항목은 어딘가에 어도비 스펙에 정의 된대로 CMap 스트림입니다. 그것들은 모두 복잡하지는 않습니다 :

/CIDInit /ProcSet findresource begin 
12 dict begin 
begincmap 
/CIDSystemInfo 
<< /Registry (TTX+0) 
/Ordering (T42UV) 
/Supplement 0 
>> def 
/CMapName /TTX+0 def 
/CMapType 2 def 
1 begincodespacerange 
<0000><FFFF> 
endcodespacerange 
80 beginbfrange 
<0003><0003><0020> 
<0024><0024><0041> 
<0025><0025><0042> 
<0026><0026><0043> 
<0027><0027><0044> 
<0028><0028><0045> 
<0029><0029><0046> 
<002a><002a><0047> 
<002b><002b><0048> 
<002c><002c><0049> 
<002d><002d><004a> 
<002e><002e><004b> 
<002f><002f><004c> 
<0030><0030><004d> 
<0031><0031><004e> 
<0032><0032><004f> 
<0033><0033><0050> 
<0034><0034><0051> 
<0035><0035><0052> 
<0036><0036><0053> 
<0037><0037><0054> 
<0038><0038><0055> 
<0039><0039><0056> 
<003a><003a><0057> 
<003b><003b><0058> 
<003c><003c><0059> 
<003d><003d><005a> 
<0065><0065><00c9> 
<00c8><00c8><00c1> 
<00cb><00cb><00cd> 
<00cf><00cf><00d3> 
<00d2><00d2><00da> 
<00e2><00e2><0160> 
<00e4><00e4><017d> 
<00e9><00e9><00dd> 
<00fd><00fd><010c> 
<0104><0104><0104> 
<0106><0106><010e> 
<0109><0109><0118> 
<010b><010b><011a> 
<0115><0115><0147> 
<011b><011b><0158> 
<0121><0121><0164> 
<0123><0123><016e> 
<01a0><01a0><0116> 
<01b2><01b2><012e> 
<01cb><01cb><016a> 
<01cf><01cf><0172> 
<022c><022c><0401> 
<023b><023b><0411> 
<023c><023c><0412> 
<023d><023d><0413> 
<023e><023e><0414> 
<023f><023f><0415> 
<0240><0240><0416> 
<0241><0241><0417> 
<0242><0242><0418> 
<0243><0243><0419> 
<0244><0244><041a> 
<0245><0245><041b> 
<0246><0246><041c> 
<0247><0247><041d> 
<0248><0248><041e> 
<0249><0249><041f> 
<024a><024a><0420> 
<024b><024b><0421> 
<024c><024c><0422> 
<024d><024d><0423> 
<024e><024e><0424> 
<024f><024f><0425> 
<0250><0250><0426> 
<0251><0251><0427> 
<0252><0252><0428> 
<0253><0253><0429> 
<0254><0254><042a> 
<0255><0255><042b> 
<0256><0256><042c> 
<0257><0257><042d> 
<0258><0258><042e> 
<0259><0259><042f> 
endbfrange 
endcmap 
CMapName currentdict /CMap defineresource pop 
end end 

와우. 그 특별한 CMap은 엄청나게 비효율적입니다. A "bfrange는"매개 변수 1에서 시작하고로 이동 및 매개 변수 (2), maping 값은 매개 변수 3에서 시작 (및지도를 더 이상 일이 없을 때까지 계속 예를 들어

:.

<0003><0003><0020> 
<0024><0024><0041> 
<0025><0025><0042> 
<0026><0026><0043> 
<0027><0027><0044> 
<0028><0028><0045> 
<0029><0029><0046> 
<002a><002a><0047> 
<002b><002b><0048> 
<002c><002c><0049> 
<002d><002d><004a> 
<002e><002e><004b> 
<002f><002f><004c> 
<0030><0030><004d> 
<0031><0031><004e> 
<0032><0032><004f> 

.

<0003><0003><0020> 
<0024><0032><0041> 

A quick google search turned up the CMap/CID font spec로 표현 beginbfchar/endbfchar 광주도있다 할 수있다 st는 두 매개 변수 (src 및 dest 값, 범위 없음), CID 기반 버전 (Adobe의 문자 ID 테이블에 액세스해야하는 시점)을 사용합니다. 그것들은 Acrobat/Reader 설치의 일부입니다. Reader는 다양한 언어 팩 (또는 그들이 말하는 모든 것)을 다운로드해야 할 필요가 있습니다. .

+0

필자의 경우, 현재 글꼴의 인코딩이 "Identity-H"인 경우 포함 된 글꼴의 FontDescriptor는 스트림에 키 "Filter"및 값 "FlateDecode"가있는 사전이 있습니다. 이것은 유니 코드 문자열을 얻기 위해 zLib을 사용하여'Tj'에서 발견 된 텍스트를 압축 해제 (말하기) 만하면된다는 의미입니까? (분명히 ...) – SK9

+0

올바른. 폰트 파일 (또는 그 일부)은 zLib로 압축됩니다. 텍스트의 압축을 풀고 글꼴의 글립 문자 -> 문자 표 [s]를 읽어야 Tj의 문자가 무엇인지 파악할 수 있습니다. 그리고 재미를 위해서, 폰트 부분 집합은 그 정보를 포함하는 데 필수적이지 않습니다 ... 어떤 점에서 그것은 "OCR 또는 흉상"입니다. –

+0

"아니요, 그렇게 작동하지 않습니다"와 같이 "수정"하십시오. –

1

이 데이터를 여러 가지 방법으로 인코딩 할 수 있습니다 (일부는 CMAP 사용). 맞춤 인코딩을 사용할 수도 있습니다 (http://www.jpedal.org/PDFblog/2011/04/understanding-the-pdf-file-format-%E2%80%93-custom-font-encodings/). 또한 CID 글꼴 (http://www.jpedal.org/PDFblog/2011/03/understanding-the-pdf-file-format-%E2%80%93-what-are-cid-fonts/)을 이해해야합니다.

+0

답장을 보내 주셔서 감사합니다. PDF에 대한 공식 가이드가 있습니다. 일부를 읽었으며 상세한 읽기를 보류하기로 결정했습니다. 내가 당신의 링크를 통해 갈거야 - 감사합니다. – SK9