Quartz を使用して pdf ファイルを解析します。
1 つのファイルを除いて、すべて正常に動作します。コールバック関数はまったく呼び出されません。
オペレーター テーブルが作成されました。CGPDFOperatorTableSetCallbackを使用してオペレーターをテーブルに追加しました。コールバックが呼び出されないだけで、すべて問題ないようです。
この動作の原因は何ですか?
Quartz を使用して pdf ファイルを解析します。
1 つのファイルを除いて、すべて正常に動作します。コールバック関数はまったく呼び出されません。
オペレーター テーブルが作成されました。CGPDFOperatorTableSetCallbackを使用してオペレーターをテーブルに追加しました。コールバックが呼び出されないだけで、すべて問題ないようです。
この動作の原因は何ですか?
ページ コンテンツは大きなフォーム XObject です。フォーム XObject は、ページのようなコンテンツ ストリームを使用する自己完結型のグラフィック オブジェクトです。
次のことを行う必要があります: スキャンされた演算子のリストに「Do」演算子を含めます。検出された場合、そのオペランドは XObject のシンボリック名です。ページ ディクショナリから「リソース」ディクショナリを取得します。「Resources」ディクショナリから「XObject」ディクショナリを取得します。「XObject」辞書から、「Do」演算子で使用される記号名を使用して xobject を取得します。xobject から「Subtype」キーの値を取得します。「画像」の場合、画像であるため xobject を無視します。「フォーム」の場合は、フォーム XObject があります。xobject からストリームを取得し、ページ コンテンツ ストリームをスキャンしたのと同じ方法でスキャンします。同じスキャナ クラスを再利用できます。スキャンしているオブジェクトを知るためにコンテキストを保持する必要があるだけです。
ページ辞書は次のようになります。
<<
/ArtBox[0.0 0.0 768.0 7066.0]
/BleedBox[0.0 0.0 768.0 7066.0]
/Contents 29 0 R
/CropBox[0.0 0.0 768.0 7066.0]
/Group 62 0 R
/MediaBox[0.0 0.0 768.0 7066.0]
/Parent 23 0 R
/Resources
<<
/ExtGState<</GS0 30 0 R>>
/XObject<</Fm0 61 0 R>>
>>
/Rotate 0
/TrimBox[0.0 0.0 768.0 7066.0]
/Type/Page
>>
「Fm0」は、ページ コンテンツ ストリームで使用されるフォーム XObject の名前であり、「Do」演算子のオペランドです。そのリソース ディクショナリは次のようになります。
/Resources
<<
/ColorSpace<</CS0 32 0 R>>
/ExtGState<</GS0 34 0 R/GS1 30 0 R>>
/Font<</T1_0 38 0 R/T1_1 40 0 R>>
/ProcSet[/PDF/Text]
/XObject<</Fm0 45 0 R/Fm1 48 0 R/Fm2 51 0 R/Fm3 54 0 R/Fm4 57 0 R/Fm5 60 0 R>>
>>
ご覧のとおり、他のいくつかのフォーム XObject を使用しています。