4

Adobe の「Document management - Portable Document Format - Part 1: PDF 1.7」 ( Pdf32000_2008.pdf ) によると、セクション 12.3.2.1 には次のように記載されています。

宛先は、次の項目で構成されるドキュメントの特定のビューを定義します。

  • 表示するドキュメントのページ

  • そのページのドキュメント ウィンドウの場所

  • 倍率 (ズーム) 係数

例:

[page /XYZ left top zoom]

しかし、私のコードでは

CGPDFArrayGetObject(dArray, 0, &dObj)

ですCGPDFDictionaryRef

93 0 obj
<< /Type /Annot
      /Subtype /Link
      /Rect [71 717 190 734]
      /Border [16 16 1]
      /A << /Type /Action
      /S /GoTo
      /D [3 0 R /FitR –4 399 199 533]
      >>
>>
endobj

3 0 Rからどのように入手でき/D [3 0 R /FitR –4 399 199 533]ますか?

のページ オブジェクトのようなページ オブジェクトへの間接参照を取得するにはどうすればよい[page /XYZ left top zoom]ですか?

これが私のコードです:

CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfRef, pageNum);
CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(pdfPage);
CGPDFArrayRef outputArray;
if(CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray))
{
    int arrayCount = 0;
    arrayCount = CGPDFArrayGetCount(outputArray );
    if(arrayCount>0)
    {
        for( int j = 0; j < arrayCount; ++j )
        {
            CGPDFObjectRef aDictObj;
            if(CGPDFArrayGetObject(outputArray, j, &aDictObj))
            {
                CGPDFDictionaryRef annotDict;
                if(CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict))
                {   
                    CGPDFDictionaryRef aDict;
                    if(CGPDFDictionaryGetDictionary(annotDict, "A", &aDict))//page 1 returns here
                    {
                        CGPDFArrayRef dArray;
                        if(CGPDFDictionaryGetArray(aDict, "D", &dArray))
                        {
                            CGPDFObjectRef dObj;
                            if(CGPDFArrayGetObject(dArray, 0, &dObj)){
                                CGPDFDictionaryRef annotDict;
                                if(CGPDFObjectGetValue(dObj, kCGPDFObjectTypeDictionary, &annotDict))
                                {

                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

リプレイありがとうございます~でも質問があるのですが、このオブジェクト番号が 3 であることはどこでわかりますか?

CGPDFArrayGetObject(dArray, 0, &dObj)

CGPDFDictionaryRef を取得しますが、フィールドが "3 0 R" であることがわかりませんでした

そして別の質問、私が知っていれば「3 0 R」です

PDF で 3 0 obj を検索するとどこで見つかりますか

返信ありがとうございます。どうもありがとうございました。

4

3 に答える 3

4

まず、PDF リファレンス ドキュメントの 366 ページの表 151 から間違った例を引用しています。これは、ケースと一致しないためです。

[page /XYZ left top zoom]

あなたのケースに一致する実際の例は次のとおりです。

[page /FitR left bottom right top]

意味:

page で指定されたページを、左、下、右、および上の座標で指定された長方形に収まるように内容を拡大して表示します。必要な水平方向と垂直方向の倍率が異なる場合は、2 つのうち小さい方を使用し、ウィンドウ内の四角形を他の次元の中央に配置します。

あなたのケースは次のように引用されているためです:

[3 0 R /FitR –4 399 199 533]

さて、例が と呼んでいるものはpage、あなたの場合は になり3 0 Rます。後者はオブジェクト番号 3 (ジェネレーション 0) への参照であり、PDF で を検索して見つけることができます3 0 objpageこれはオブジェクト番号 3 を定義する場所であり、目的地で探しているものに名前を付ける必要があります。


更新:実際のドキュメントに snippet が実際に含まれている[3 0 R /FitR –4 399 199 533]場合、同じドキュメントには、ページ オブジェクト (間接的に参照) を として定義する別の部分も含まれている必要があります3 0 obj。この部分はページ オブジェクトを定義し、次のように読むことができます。

 3 0 obj
   << /Type /Page
      /Parent 11 0 R
      /MediaBox [ 0 0 597.6 842.4 ]
      /Contents 31 0 R
      /Group <<
                /Type /Group
                /S /Transparency
                /CS /DeviceRGB
             >>
      /Resources 23 0 R
   >>
 endobj

このオブジェクトが再び 3 つの他のオブジェクトを参照する方法に注意してください: 11 0 R31 0 Rおよび23 0 R。後者の 2 つは、ページのコンテンツ (31) とリソース (23) を保持するオブジェクト 31 と 23 を指し、ページで使用される fe フォントです。最初のものは、このページの親オブジェクト (11) を指しています。

注 2: オブジェクトは PDF ファイルに表示されるため、オブジェクトの番号付けは連続している必要はありません。(ほぼ)唯一の条件は、番号付けが一意であることです。

于 2011-06-09T19:04:55.707 に答える
-1

vfr/Reader で github のコードを確認してください。彼らは、これらすべてのリンクを把握したようです。PDFドキュメントからは、何が起こっているのかはっきりしません。

于 2014-06-30T21:29:22.967 に答える