2

シナリオ:

iTextSharp を使用して PDF ファイルのハイパーリンクをスコージするアプリケーションがあります。

PDF のハイパーリンクはファイル構造の「注釈オブジェクト」のサブタイプであるため、私のコードは基本的に (1) ファイルを読み取り、(2) ページをループし、(3) ページの注釈コレクションを取得し、( 4) ページのハイパーリンク注釈を抽出します。

問題

/ANNOTS特定のページを表す「pdf 辞書」オブジェクトに、注釈のコレクション (no ) キーがない場合があります。したがって、そのようなコレクションを取得しようとする試みは を返しnullます。問題のページに明確に表示され、クリック可能なリンクがある場合に時々発生するため、これは問題です。

プレーン テキストに URL アドレスが存在する可能性があることは理解しているため、クリック可能であることが重要であることに注意してください。

コード

提供された回答で同様のSOの質問(http://stackoverflow.com/questions/6959076/reading-hyperlinks-from-pdf-file)を見つけましたが、これは私がすでに使用しているコードとほぼ同じです。主な違いは次のとおりです。

// My code
var pdfAnnotations = (PdfArray)PdfReader.GetPdfObject(pageDict.Get(PdfName.ANNOTS));
foreach (var annotation in pdfAnnotations.ArrayList) {}
                    {

// Chris' code                        
var annotsArray = pageDict.GetAsArray(PdfName.ANNOTS); 
foreach(var annotation in annotsArray.ArrayList) { }

// My pageDict.Get() and Chris's pageDict.GetAsArray() methods both 
// return null because there is no ANNOTS key present in pageDict.

質問

なぜ null 値なのですか? 明白に表示/クリック可能なリンクを含むPDFドキュメントに注釈コレクションがないのはどうしてですか? ハイパーリンク/URI を表すファイル構造内に他のPdfObjectサブタイプはありますか?

ありがとう

4

2 に答える 2

2

それでは、推測してみてください。(分析するサンプルがないため、他に何もする方法はありません。)

ところで、PDFコード内では決してありません /ANNOTS-PDFキーでは大文字と小文字が区別されます!-常に/Annotsです。

PDFソースコードでは、名前オブジェクトのようなASCII文字列/Annotsは、次の代替方法のいずれかで表すことができます。これらはすべて、PDF仕様によると「合法」です( PDF-1.7仕様の7.3.5項「名前オブジェクト」を参照)。

 /Annots
 /#41nnots      # '#41' is the hex represenation of ASCII 'A' in PDF
 /A#6Enots      # '#6E' is the hex represenation of ASCII 'n' in PDF
 /An#6Eots      # '#6E' is the hex represenation of ASCII 'n' in PDF
 /A#6E#6Eots    # '#6E' is the hex represenation of ASCII 'n' in PDF
 ...
 /Annot#73      # '#73' is the hex represenation of ASCII 's' in PDF

あなたはアイデアを得る...(私の簡単な計算が正しければ、これの32の異なるバリエーションを作ることができます...)

/#4Aava#53criptこれは、ところで、ブラックハットハッカーがマルウェアPDFのキーを難読化するために使用する最も簡単な手段の1つです。それらの潜在的な方法のより完全なリストは、「Corkamiプロジェクト」を参照してください。)

たぶん、あなたのバージョンのiTextSharp(あなたが述べなかった)は、/Annots名前キーのすべての表現の検索を正しく処理しませんか?

もしそうなら、あなたへの私の提案は、あなたがあなたを探す前にあなたが各PDFのコピーを正規化/Annotsすることです。コマンドラインツール(およびのAPI)qpdfを使用すると、これを正常に実現できます。

 qpdf --qdf helloworld.pdf qdf---helloworld.pdf

どれどれ:

 kp@mbp:~$  grep nnots helloworld.pdf
      /#41nnots 57 0 R

 kp@mbp:~$  qpdf --qdf helloworld.pdf qdf---helloworld.pdf

 kp@mbp:~$  grep nnots qdf---helloworld.pdf
 qdf---helloworld.pdf:     /Annots 57 0 R
于 2012-07-09T21:51:20.000 に答える
0

心配する必要がある他のリンクのようなPDFオブジェクト(アウトライン/ブックマーク要素と埋め込まれたjavascript関連のものを除く)はないと確信しています。しかし、リンク注釈としてエンコードされていなくても、テキスト内の URL パターンを見つけてクリック可能にする読者もいます。それを見るためのPDFがなければ、これがあなたのケースで起こっていることです. (これをテストするには、テキストに単純な URL を含む (リンク注釈を含まない) PDF を作成し、読者がクリックできるかどうかを確認します。)

于 2012-07-09T20:28:55.097 に答える