3

現在、tmパッケージのreadPDF()関数を使用して、いくつかのPDFからいくつかのテキストデータをスクレイピングしています。これはすべて非常にうまく機能し、ほとんどの場合、エンコーディングは「latin1」のように見えますが、そうでない場合もあります。Rで文字エンコードをチェックする良い方法はありますか?tauパッケージに関数is.utf8()とis.local()が含まれていることがわかりましたが、これまでのところ、明らかにそれしか得られません。

ありがとう。

4

2 に答える 2

1

私は R についてあまり知りません。しかし、言及されたtmおよびtauパッケージが何であるかを確認するために、CRAN を少し調べてみました。

したがって、tmpdftotextはテキスト マイニング用であり、PDF の読み取り用には Popplerのユーティリティが必要であり、それに依存しています。私は最初、[明らかに間違った]印象を持っていました.あなたが言及したreadPDF()関数は、PDFファイル内のPDFオブジェクトへの低レベルのライブラリベースのアクセスを直接行っていた....私はどれほど間違っていたのでしょう! pdftotextコマンドラインツールのテキスト出力を「のみ」見ることが判明しました。

これは、「単純な」Latin1 よりも複雑なフォント エンコーディングを使用する PDF の読み取りにおそらく成功しない理由を説明しています。

残念ながら、あなたの問題の理由は、現在 Poppler でありpdftotext、単にこれらを処理できないためです。

たぶん、tmのメンテナーに機能のリクエストを依頼したほうがよいでしょう: :-)

  • PDFlib.com のTET (英語版)など、より有能なサード パーティの PDF テキスト抽出ツールのサポートをtmパッケージに追加してみてください。Adobe独自のツール、ところで)。
于 2012-07-05T21:29:47.507 に答える
1

PDF 仕様では、準拠するリーダーで事前定義する必要があるラテン テキストの単純なフォント(それぞれに最大 256 文字の形状を含めることができる)のこれらのエンコーディングを定義しています。

  • /StandardEncoding
    ( Type 1 Latin テキスト フォントの場合。TrueTypeフォントの場合は除く)
  • /MacRomanEncoding
    ( TrueTypeフォントとType1フォント の両方の Mac OS 標準エンコーディング)
  • /PDFDocEncoding
    (ドキュメントのコンテンツ ストリームの テキスト文字列にのみ使用されます。通常、フォントからテキストを表示するためには使用されません)
  • /WinAnsiEncoding
    (Windows コード ページ 1252 エンコーディング、TrueTypeフォントとType1フォントの両方)
  • /MacExpertEncoding
    (名前は誤解を招きます -- エンコーディングはプラットフォーム固有ではありません。ただし、このエンコーディングを使用するための適切な文字セットを持つフォントはほとんどありません)

次に、記号フォントには 2 つの特定のエンコーディングがあります。

  • シンボルのエンコード
  • ZapfDingBats エンコーディング

また、フォントには組み込みのエンコーディングを含めることができますが、これは作成者が標準のエンコーディングから逸脱する可能性があります (fe は、埋め込まれた標準フォントがサブセット化されている場合の差分エンコーディングにも使用されます)。

そのため、PDF ファイルを正しく解釈するには、使用されているフォントの各フォント エンコーディングを検索する必要があり、配列/Encodingを使用している場合も考慮に入れる必要があります。/Differences

ただし、単純なフォントの場合、全体的なタスクは依然として非常に単純です。PDFビューアプログラムは、「テキスト文字列を表すことを意図しているバイトシーケンスの各バイト」「エンコーディングテーブルで検索できる、描画する正確に1つのグリフ」に1:1でマッピングする必要があります。


コンポジットのCID キー付きフォント (何千もの文字形状が含まれている可能性があります) の場合、ビューアー プログラムのルックアップ/マッピングは、「これは、テキストとして描画することになっていることがわかっているバイトのシーケンスです」から「これは描画するグリフ形状の順序」は 1:1 ではなくなりました。ここでは、CIDFont から各グリフを1 つ選択するために、 1 つ以上のバイトのシーケンスをデコードする必要があります。

そして、この CIDFont デコードを支援するには、CMap 構造が必要です。CMap は、Unicode エンコーディングから文字コレクションへのマッピングを定義します。PDF 仕様では、中国語、日本語、および韓国語のフォントについて、少なくとも 5 ダースの CMap とその標準名が定義されています。これらの事前定義された CMap は、PDF に埋め込む必要はありません (ただし、適合する PDF リーダーは、それらを正しく処理する方法を知っている必要があります)。しかし、(もちろん) PDF 作成アプリケーションが PDF を書き出したときに「オンザフライ」で生成されたカスタム CMap もあります。その場合、CMap を PDF ファイルに埋め込む必要があります。

これらの複雑さに関するすべての詳細は、公式の PDF-1.7 仕様に記載されています。

于 2012-07-05T16:47:12.093 に答える