Как получить косвенную ссылку на объект страницы с CGPDF?

В соответствии с документом Adobe "Управление документами - переносимый формат документов - часть 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

спасибо, ответ, спасибо, очень, очень, очень... Я надеюсь получить ваш ответ agian!

3 ответа

Во-первых, вы цитируете неправильный пример из таблицы 151, стр. 366 Справочного документа PDF, поскольку он не соответствует вашему случаю:

[page /XYZ left top zoom]

Реальный пример, который соответствует вашему случаю:

[page /FitR left bottom right top]

имея в виду:

Отобразите страницу, обозначенную страницей, с ее содержимым, увеличенным настолько, чтобы уместить прямоугольник, заданный координатами left, bottom, right и top, в пределах окна как по горизонтали, так и по вертикали. Если требуемые горизонтальные и вертикальные коэффициенты увеличения отличаются, используйте меньшее из двух, центрируя прямоугольник внутри окна в другом измерении.

потому что ваш случай цитируется как:

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

Теперь, что пример относится к page, в вашем случае становится 3 0 R, Последний является ссылкой на объект № 3 (поколение 0), который вы можете найти, выполнив поиск в вашем PDF для 3 0 obj, Это место, которое определяет объект № 3, который должен назвать то, что вы искали page для вашего назначения.


Обновление: если ваш настоящий документ действительно содержит фрагмент [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

Обратите внимание, как этот объект снова ссылается на три других объекта: 11 0 R, 31 0 R а также 23 0 R, Последние два указывают на объекты 31 и 23, которые содержат содержимое страницы (31) и ресурсы (23), используемые ею шрифты. Первый указывает на родительский объект (11) этой страницы.

Примечание 2: нумерация объектов не обязательно должна быть последовательной, поскольку объекты отображаются в файле PDF. Единственное (почти) условие состоит в том, что нумерация уникальна.

Проверьте код в github в vfr/Reader. Похоже, они разобрались со всеми этими ссылками. Из документа PDF не ясно, что происходит.

Увы, пока ответы ведущие, до сих пор не ясно, что нам нужно. Фрагмент кода, который показывает номер страницы или имя, к которому мы должны перейти, поможет.

Другие вопросы по тегам