그럼 지난 글에 이어서 계속 분석해 보겠습니다.
이제 pdf2text 함수에서 getCharTransformations 함수 call 하는 부분을 볼 차례입니다.
지난번에 preg_match_all 을 사용해서 BT,ET 로 구분해서 데이터를 따로 모으고 그 데이터를 압축해제 해서 그나마 사람이 조금 알아 볼 수 있는 데이터로까지 만들었었는데요.
이 BT,ET 구분에 해당하지 않는 else 부분에서 getCharTransformations 함수를 호출합니다.
전달하는 인자는 첫번째 인자로 pdf2text 초반에 만들어 뒀던 $transformations 배열 변수하고 getDecodedStream 함수를 통해서 얻었던 $data 변수입니다.
function getCharTransformations(&$transformations, $stream) {
preg_match_all("#([0-9]+)\s+beginbfchar(.*)endbfchar#ismU", $stream, $chars, PREG_SET_ORDER);
preg_match_all("#([0-9]+)\s+beginbfrange(.*)endbfrange#ismU", $stream, $ranges, PREG_SET_ORDER);
for ($j = 0; $j < count($chars); $j++) {
$count = $chars[$j][1];
$current = explode("\n", trim($chars[$j][2]));
for ($k = 0; $k < $count && $k < count($current); $k++) {
if (preg_match("#<([0-9a-f]{2,4})>\s+<([0-9a-f]{4,512})>#is", trim($current[$k]), $map))
$transformations[str_pad($map[1], 4, "0")] = $map[2];
}
}
for ($j = 0; $j < count($ranges); $j++) {
$count = $ranges[$j][1];
$current = explode("\n", trim($ranges[$j][2]));
for ($k = 0; $k < $count && $k < count($current); $k++) {
if (preg_match("#<([0-9a-f]{4})>\s+<([0-9a-f]{4})>\s+<([0-9a-f]{4})>#is", trim($current[$k]), $map)) {
$from = hexdec($map[1]);
$to = hexdec($map[2]);
$_from = hexdec($map[3]);
for ($m = $from, $n = 0; $m <= $to; $m++, $n++)
$transformations[sprintf("%04X", $m)] = sprintf("%04X", $_from + $n);
} elseif (preg_match("#<([0-9a-f]{4})>\s+<([0-9a-f]{4})>\s+\[(.*)\]#ismU", trim($current[$k]), $map)) {
$from = hexdec($map[1]);
$to = hexdec($map[2]);
$parts = preg_split("#\s+#", trim($map[3]));
for ($m = $from, $n = 0; $m <= $to && $n < count($parts); $m++, $n++)
$transformations[sprintf("%04X", $m)] = sprintf("%04X", hexdec($parts[$n]));
}
}
}
}
이 함수에서도 처음부터 preg_match_all 함수가 사용됩니다. 정규 표현식은 '#([0-9]+)\s+beginbfchar(.*)endbfchar#ismU' 와 '#([0-9]+)\s+beginbfrange(.*)endbfrange#ismU' 가 사용됩니다.
처음것은 숫자와 관련돼 있고 그 다음에는 뭔지는 모르지만 begin bf char 와 end bf char 가 사용됐습니다.
다른 형식의 파일들은 BT, ET 가 아니라 beginbfchar 와 endbfchar 로 블럭이 나뉘나 봅니다.
이 부분은 우리가 테스트 하는 pdf 파일형식이랑은 상관없는 것 같지만 그래도 시작했으니 마저 보겠습니다.
하여간 이 두 preg_match_all 함수를 사용해서 $chars 와 $ranges 라는 변수를 반들어 냈습니다.
그 다음에는 chars 에 대해서 먼저 for 문을 돌리는데요.
explode() 함수를 사용해서 줄바뀜 '\n' 이 일어나는 단위로 분리를 하고 trim() 으로 좌우의 공백을 없앱니다.
다음 그 분리된 값들로 다시 for 문을 돌리는데요.
preg_match 를 사용해서 다시 나눕니다. 정규표현식인 '#<([0-9a-f]{2,4})>\s+<([0-9a-f]{4,512})>#is' 를 사용해서 나누는데.. 이게 뭔뜻인지 속시원히 알면 좋겠네요.
혹시 이와 관련해서 쉽고 좋은 글 있는 곳아시는 분 계시면 알려 주세요.
하여간 이렇게 해서 만들어진 값을 $map 에 담습니다.
그리고 그 값을 $transformations 배열 변수에 원하는 형식으로 담는군요.
str_pad() 함수 관련한 예제는 아래에 있습니다.
<?php
$input = "Alien";
echo str_pad($input, 10); // produces "Alien "
echo str_pad($input, 10, "-=", STR_PAD_LEFT); // produces "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH); // produces "__Alien___"
echo str_pad($input, 6 , "___"); // produces "Alien_"
?>
어떤 string 에 공백이나 일정한 문자나 기호를 넣을 수 있는 함수 같네요.
우리가 공부하는 소스에서는 아래와 같이 이용했습니다.
$transformations[str_pad($map[1], 4, "0")] = $map[2];
그럼 $map[1] 다음에 4칸을 0으로 채운 곳에 $map[2] 를 대입한다는 얘기네요.
그 다음은 $ranges 에 대해 for 문을 돌립니다.
이 경우도 줄바꿈을 기준으로 데이터를 분리하고 위 for 문과 비슷하게 돌리는데요.
hexdec() 함수가 보입니다.
<?php
var_dump(hexdec("See"));
var_dump(hexdec("ee"));
// both print "int(238)"
var_dump(hexdec("that")); // print "int(10)"
var_dump(hexdec("a0")); // print "int(160)"
?>
매뉴얼에는 hexadecimal string 을 decimal number 로 변환해 주는 함수로 나와 있습니다.
이 두번째 for 문은 자세히 안 보겠습니다. 지금 사용하는 pdf 파일을 decode 하는데는 사용되지 않는 부분 같으니까요.
그러면 이제 다 분석 한 거구요.
pdf2text() 함수의 마지막 줄만 남았습니다.
return getTextUsingTransformations($texts, $transformations);
이 return 값이 완전히 사람이 읽을 수 있는 텍스트로 바뀐 값입니다.
지난 글에서 살짝 사람이 읽을 수 있는 데이터로 압축을 해제해서 만든 값을 getTextUsingTransformations() 함수에서 돌려서 완전히 사람이 읽을 수 있는 글자로 만들어 주는 겁니다.
제가 얻고 싶은 대로 데이터를 가공하려면 이 getTextUsingTransformations() 함수 부분을 잘 공부해야 될 것 같습니다.
이 함수는 다음 글에서 자세히 분석해 보겠습니다.
|
|
'etc. > PHP' 카테고리의 다른 글
PDF 내용을 Text 로 추출하는 PHP 프로그램 분석해 보기 7 (0) | 2013.01.16 |
---|---|
PDF 내용을 Text 로 추출하는 PHP 프로그램 분석해 보기 5 (0) | 2013.01.15 |
PDF 내용을 Text 로 추출하는 PHP 프로그램 분석해 보기 4 (0) | 2013.01.08 |
PDF 내용을 Text 로 추출하는 PHP 프로그램 분석해 보기 3 (0) | 2013.01.08 |
PDF 내용을 Text 로 추출하는 PHP 프로그램 분석해 보기 2 (0) | 2013.01.08 |
PDF 내용을 Text 로 추출하는 PHP 프로그램 분석해 보기 1 (0) | 2013.01.05 |
PHP와 XSL 로 XML 변환하기 (0) | 2012.12.21 |
PHP로 XML , JSON 다루기 (2) | 2012.08.24 |
-PHP - Proxy 통해 원격 파일 존재 여부 파악하기 (0) | 2012.07.19 |