2017-04-18 10 views
-2

[Ubuntu Linux 14.04 및 16.04에서] 문자가 이상한 기호로 매핑되는 PDF 문서를 만드는 컵 -PDF로 인해 문제가 있습니다. 나는 파이썬이 나에게 문자열 타입을 알려주고 있다고해도 일종의 유니 코드라고 생각한다. type(object) 파이썬 반환 "string"읽을 수있는 텍스트로 스크램블 된 PDF 문자를 다시 매핑하십시오

나는 evince/Firefox 또는 Python PDFminer 모듈을 통해 마우스 복사 붙여 넣기를 통해 PDF의 텍스트를 가져 오는 경우 차이가 없습니다. 따라서 사실 PDF는 PDF 문서 자체에서 올바르게 렌더링되는 텍스트 정보를 손상 시켰습니다. 나는 그것을 알지 못했다. 그러나 PDF 문서의 텍스트와 텍스트 그래픽은 매우 긴밀하게 묶여있는 것처럼 보이지 않는다. 내가 예에서와 같은 만든 PDF 문서에서 이름을 텍스트를 복사 할 때 "✡✍✑✒✍☛✓"는 각각의 단일 문자가 "✡=R ✍=a ✑=p ✒=h ✍=a ☛=e ✓=l"

또 다른 예에 매핑에

은 "라파엘이"변 : "Devel""✭☛✮☛✓"

로 바뀝니다 어떻게 할 수 이 잘못된 정보를 올바른 것으로 옮기는 파이썬 함수를 작성 하시겠습니까? PDF 문서에서 모든 것이 완벽하게 읽을 수 있습니다.

여기에는 포스트 스크립트를 사용하여 PDF를 작성하지만 올바른 글꼴/문자 정보를 문서에 추가하지 않는 컵 -PDF가 포함됩니다.

편지 'l'은 항상 기호 '✓' 경우,이 checkmark unicode character

파이썬에서 어떻게 표현을 수정하는이 이상한 표현으로 문자를 다시 매핑 할 수 있습니까? 그렇다면 '✓' 기호를 'l' 문자로 바꾸거나 재 매핑 할 수 있습니까? 어떤 아이디어?

왜 내가 필요한가? 이 문서에서 텍스트 값을 검색해야합니다.

+0

예, PDF 복사를 방지하기 위해 전문 글꼴을 사용하는 것으로 나타납니다. 텍스트는 * scrambled *이지만 폰트의 글자도 마찬가지입니다. 따라서 'a'가 유니 코드 코드 포인트 U + 0061에 매핑 되었다면, PDF는 대신에 모든 a를 U + 270D로 대체하고 특수 폰트는 일반 "WRITING HAND"글립 문자를 문자 a로 대체했습니다. 대체 요원이에요. –

+0

당신은 맞습니다. Martijn Pieters는 유니 코드 "U + 270D"와 같습니다. 어떻게 그 텍스트를 디 스크램블링 할 수 있습니까? 어떻게 그 문자들을 원래의 값으로 되돌려 놓을 수 있습니까? 지금은 "U + 270D"이고 "U + 0061"로 돌아 간다? 파이썬 함수 arround가 있습니까? –

답변

0

PDF가 복사를 방지하기 위해 특수 글꼴을 사용하고있는 것으로 보입니다. 텍스트는 인데 글꼴에 글자가 있습니다. 따라서 a이 유니 코드 코드 포인트 U + 0061에 매핑 된 경우 PDF는 대신에 모든 a를 U + 270D로 바꾸고 특수 글꼴은 일반 "쓰기 손"문자를 문자 a로 바꿉니다.

즉, substitution cypher을 사용하고 있습니다.

다른 대체 cypher와 마찬가지로 해독해야합니다. 암호화 된 코드 포인트에서 암호화되지 않은 코드 포인트로 역 매핑을 만들어야합니다. PDF를 가이드로 사용할 수 있습니다. 인간으로서 당신은 실제 텍스트를 쉽게 읽을 수 있으며 복사 된 유니 코드 코드 포인트와 어떻게 관련되는지 볼 수 있습니다.

예를 들어, 우리는 U + 270D는 U + 0061에 매핑 알고 :

>>> hex(ord('✍')) 
'0x270d' 
>>> hex(ord('a')) 
'0x61' 

당신이 PDF에서 a을 복사 할 때 때문에, 대신 270d 코드 포인트를 얻었다. 알파벳의 나머지 부분에 대한 표를 작성하기 만하면됩니다. 많은 수작업처럼 들릴지 모르지만 이미 일반 텍스트가 있습니다. 텍스트에 포함 된 내용을 알지 못한다고 상상해보십시오 (예 :당신은 단지 텍스트를 복사하는 상징을 가지고 있습니다); 그런 다음 먼저 전체 암호 해독을 수행해야합니다 (대체 키퍼의 경우 특정 언어를 사용하고 기호를 계산합니다. 각 언어는 문자에 대한 일반적인 빈도 분포를 가지며 이러한 배포는 암호화 된 텍스트 본문에서 일치 할 수 있음) 다시 원래 문자로 매핑).

이론적으로 특수 글꼴을 추출한 다음 분석하여 변환 테이블을 생성 할 수 있어야합니다. 그러나 이것은 컴퓨터 비전의 어떤 형태를 필요로합니다. 컴퓨터는 픽셀의 래스터 또는 일련의 벡터 선이 특정 문자를 형성한다는 것을 쉽게 알 수 없습니다. 약 70 개의 코드 포인트 (대문자, 소문자, 숫자, 구두점)의 경우 손으로 테이블을 만드는 것이 더 쉽습니다.

일단 테이블이 있으면 Python이 번역을 수행 할 수 있습니다. 나는 당신의 단서를 가지고 그냥 그 편지에 대한 부분 테이블을 만들었습니다

mapping = { 
    0x270d: 'a', 
    0x261b: 'e', 
    0x2712: 'h', 
    0x2713: 'l', 
    0x2711: 'p', 
    0x272e: 'v', 

    0x272d: 'D', 
    0x2721: 'R', 
} 

print(encrypted.translate(mapping)) 

당신이 나머지 매핑을 작성하기 만하면됩니다; str.translate() method이 나머지 부분을 처리합니다. 샘플 암호화 된 텍스트 샘플에 위의 부분 테이블을 사용하여

데모 :

>>> print("✡✍✑✒✍☛✓".translate(mapping)) 
Raphael 
>>> print("✭☛✮☛✓".translate(mapping)) 
Devel 
+0

위대하고 상세한 지침. 아마 토요일에 내 결혼식에 참여할 수있을거야. 당신의 도움이 없었다면 제 시간에 그것을 할 수 없었습니다. - 고맙습니다. 파이썬 2.7에서이 문제를 해결하고 곧 답변 드리겠습니다! –

+0

@MisterWong : '유니 코드'문자열을 사용했는지 확인하십시오. 'str.translate()'와'unicode.translate()'메소드는 서명이 다릅니다. 위의 코드는 파이썬 3과 파이썬 2'unicode.translate()'에서 작동합니다. –