hex_re = re.compile(r
'([a-f\d]{2})'
, re.IGNORECASE)
trail_re = re.compile(r
'^(?:[a-f\d]{2}|\s)*([a-f\d])[\s>]*$'
, re.IGNORECASE)
def asciihexdecode(data):
""
"
ASCIIHexDecode filter: PDFReference v1.4 section 3.3.1
For each pair of ASCII hexadecimal digits (0-9 and A-F or a-f), the
ASCIIHexDecode filter produces one byte of binary data. All white-space
characters are ignored. A right angle bracket character (>) indicates
EOD. Any other characters will cause an error. If the filter encounters
the EOD marker after reading an odd number of hexadecimal digits, it
will behave as
if
a 0 followed the last digit.
>>> asciihexdecode(
'61 62 2e6364 65'
)
'ab.cde'
>>> asciihexdecode(
'61 62 2e6364 657>'
)
'ab.cdep'
>>> asciihexdecode(
'7>'
)
'p'
""
"
decode = (lambda hx: chr(int(hx, 16)))
out = map(decode, hex_re.findall(data))
m = trail_re.search(data)
if
m:
out.append(decode(
"%c0"
% m.group(1)))
return
''
.
join
(out)