3

私が取り組んでいるプロジェクトでは、さまざまな政府のサイトから法的文書を取得し、オンラインで検索できるようにしています。

時々、破損しているように見えるPDFに遭遇します。これがその一例です

PDFリーダーで開くと、問題ないように見えますが、次のようになります。

  • コピーして貼り付けようとすると、テキストが破損します
  • pdftotextなどのツールを使用して実行すると、テキストが破損します
  • あなたがそれに他のことをするなら-あなたはそれを推測しました-あなたは壊れたテキストを手に入れます

それでも、リーダーで開くと、問題ないように見えます。だから私はテキストがそこにあることを知っています、しかし何かが間違っている、間違っている!その結果、私のサイトでは本当にひどく見えます。

何か私にできることはありますか?

更新:今日はさらに調査を行いました。これは本質的にシーザー暗号であるという@AndrewCashの観察のおかげで、私はドキュメントを検索できることに気づきました。このリンクは、私のシステムでこれらの約200を表示します。より大きなサンプルセットを見ると、これらはすべて同じソフトウェアpdffactoryv。3.51によって作成されているように見えます。だから私は、意図的な難読化ではなく、バグのせいにします。

更新2:上記のリンクはもう結果を提供しません。これらは、以下のソリューションを使用してシステムから削除されます。

4

2 に答える 2

3

PDFはサブセット化されたフォントを使用しており、単純な第二次世界大戦の換字式暗号と同じものを使用して、文字が他の文字に再マップされます。

A = G、B = 1、C =#、D = W、......など。すべてのキャラクターが再マップされます。

フォントはこのようにマッピングされ、PDFに表示される正しい文字を取得するには、ABCDを印刷するために「G1#W」を送信する必要があります。通常、PDFにはテキスト抽出に役立つToUnicodeテーブルがありますが、このテーブルは意図的に省略されていると思います。

私はこれらの文書のいくつかを自分で見ましたが、テキストの抽出を防ぐために意図的に難読化されています。約5種類のフォントを使用したドキュメントを見たことがありますが、それらはすべて異なるシーケンスを使用してマッピングされています。

これが問題であるかどうかを判断する確実な方法の1つは、PDFをAcrobatにロードし、テキストをコピーしてテキストエディタに貼り付けることです。Acrobatがテキストを英語にデコードできない場合、翻訳マッピングがわかっている場合は、手動で再マッピングせずにテキストを抽出する方法はありません。

これらのタイプのドキュメントからテキストを簡単に抽出する唯一の方法は、ドキュメント全体をOCRして、元のテキストを削除することです。OCRはページをTIFF画像に変換してからOCRするため、元の文字化けしたテキストがOCRに影響を与えることはありません。

于 2012-02-10T07:37:13.617 に答える
2

この問題にうんざりしていて、OCRを扱いたくないので、私は手動で暗号を分類しました。ここに彼女は、私がそれをテストするために使用していたいくつかの基本的なコードと一緒にpythondictとしてあります。これは改善できると確信していますが、まだ見つけられていない大文字のQと大文字のXを除くすべての文字で機能します。

少なくとも今のところ、かなりの句読点が欠落しています(たとえば、<>?{} \ |!〜 `@#$%^ _ = +)。

# -*- coding: utf-8 -*-

import re
import sys

letter_map = {
 u'¿':'a',
 u'regex':'b',
 u'regex':'c',
 u'regex':'d',
 u'»':'e',
 u'o':'f',
 u'1':'g',
 u'regex':'h',
 u'·':'i',
 u'¶':'j',
 u'μ':'k',
 u'regex':'l',
 u'3':'m',
 u'2':'n',
 u'±':'o',
 u'°':'p',
 u'regex':'q',
 u'®':'r',
 u'-':'s',
 u'¬':'t',
 u'«':'u',
 u'a':'v',
 u'©':'w',
 u'regex':'x',
 u'§':'y',
 u'¦':'z',
 u'ß':'A',
 u'Þ':'B',
 u'Ý':'C',
 u'Ü':'D',
 u'Û':'E',
 u'Ú':'F',
 u'Ù':'G',
 u'Ø':'H',
 u'×':'I',
 u'Ö':'J',
 u'Õ':'K',
 u'Ô':'L',
 u'Ó':'M',
 u'Ò':'N',
 u'Ñ':'O',
 u'Ð':'P',
 u'':'Q', # Missing
 u'Î':'R',
 u'Í':'S',
 u'Ì':'T',
 u'Ë':'U',
 u'Ê':'V',
 u'É':'W',
 u'':'X', # Missing
 u'Ç':'Y',
 u'Æ':'Z',
 u'ð':'0',
 u'ï':'1',
 u'î':'2',
 u'í':'3',
 u'ì':'4',
 u'ë':'5',
 u'ê':'6',
 u'é':'7',
 u'è':'8',
 u'ç':'9',
 u'ò':'.',
 u'ô':',',
 u'æ':':',
 u'å':';',
 u'Ž':"'",
 u'•':"'",
 u'•':"'", # s/b double quote, but identical to single.
 u'Œ':"'", # s/b double quote, but identical to single.
 u'ó':'-', # dash
 u'Š':'-', # n-dash
 u'‰':'--', # em-dash
 u'ú':'&',
 u'ö':'*',
 u'ñ':'/',
 u'÷':')',
 u'ø':'(',
 u'Å':'[',
 u'Ã':']',
 u'‹':'•',
 }

ciphertext = u'''YOUR STUFF HERE'''

plaintext = ''

for letter in ciphertext:
    try:
        plaintext += letter_map[letter]
    except KeyError:
        plaintext += letter

# These are multi-length replacements
plaintext = re.sub(u'm⁄4', 'b', plaintext)
plaintext = re.sub(u'g⁄n', 'c', plaintext)
plaintext = re.sub(u'g⁄4', 'd', plaintext)
plaintext = re.sub(u' ́', 'l', plaintext)
plaintext = re.sub(u' ̧', 'h', plaintext)
plaintext = re.sub(u' ̈', 'x', plaintext)
plaintext = re.sub(u' ̄u', 'qu', plaintext)

for letter in plaintext:
    try:
        sys.stdout.write(letter)
    except UnicodeEncodeError:
        continue
于 2012-02-10T22:39:15.690 に答える