1

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 で例外が発生しないようにするには、何を変更する必要があると思いますか、またはどこを調査する必要があると思いますか?

4

3 に答える 3