PDFMinerを使用して .pdf ファイルを .xml ファイルに変換しています。
.pdf ファイル内の単語ごとに、PDFMiner はそれが Unicode であるかどうかをチェックします (他の多くのものの中でも特に)。そうである場合は文字を返し、そうでない場合は例外を発生させ、文字列 "(cid:%d)" を返します。ここで、%d は文字 ID であり、これは Unicode Decimal だと思います。
これは、この質問の編集部分でよく説明されています: What is this (cid:51) in the output of pdf2txt? . 便宜上、ここにコードを報告します。
def render_char(self, matrix, font, fontsize, scaling, rise, cid):
try:
text = font.to_unichr(cid)
assert isinstance(text, unicode), text
except PDFUnicodeNotDefined:
text = self.handle_undefined_char(font, cid)
def handle_undefined_char(self, font, cid):
if self.debug:
print >>sys.stderr, 'undefined: %r, %r' % (font, cid)
return '(cid:%d)' % cid
通常、キリル文字で記述された .pdf ファイルに対してこの例外が発生します。ただし、平易な英語を使用するファイルが 1 つあります。このファイルでは、非改行スペース (cid=160 を持つ) に対してこの例外が発生します。同じファイル内の他のすべての文字が Unicode として認識されるのに、なぜこの文字が認識されないのかわかりません。
同じ環境でisinstance(u'160', unicode)
コンソールで実行すると、 PDFMiner 内で実行するとTrue
(明らかに) 同等のコマンドが返されます。False
デバッグすると、フォントが正しく認識されていることがわかります。つまり、次のようになります。
cid = 160
font = <PDFType1Font: basefont='Helvetica'>
PDFMiner はコーデックをパラメーターとして受け入れます。私は utf-8 を選択しました。これは、改行なしのスペース ( http://dev.networkerror.org/utf8/ )の Unicode Decimal として 160 を持っています。
それが役立つ場合は、to_unichr のコードを次に示します。
def to_unichr(self, cid):
if self.unicode_map:
try:
return self.unicode_map.get_unichr(cid)
except KeyError:
pass
try:
return self.cid2unicode[cid]
except KeyError:
raise PDFUnicodeNotDefined(None, cid)
コードによって認識される文字マップを設定/変更する方法はありますか?
cid=160 で例外が発生しないようにするには、何を変更する必要があると思いますか、またはどこを調査する必要があると思いますか?